基础 30 题系列1
第一题
代码实现
参考实现
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10,mod=1e9+7;
int n,f[N][N];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
f[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=n;j++){
f[i][j]=f[i-1][j];
if(j-i>=0) f[i][j]=(f[i][j]+f[i-1][j-i])%mod;
}
}
cout<<f[n][n]<<"\n";
return 0;
}
import java.io.*;
import java.util.*;
public class Main{
static final int N=1000+10,mod=1000000007;
static int[][] f=new int[N][N];
public static void main(String[] args)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(br.readLine());
f[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=n;j++){
f[i][j]=f[i-1][j];
if(j-i>=0){
f[i][j]=(f[i][j]+f[i-1][j-i])%mod;
}
}
}
System.out.println(f[n][n]);
}
}
import sys
input=sys.stdin.readline
mod=10**9+7
n=int(input())
f=[[0]*(n+1) for _ in range(n+1)]
f[0][0]=1
for i in range(1,n+1):
for j in range(0,n+1):
f[i][j]=f[i-1][j]
if j-i>=0:
f[i][j]=(f[i][j]+f[i-1][j-i])%mod
print(f[n][n])
第二题
代码实现
参考实现
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10,mod=1e9+7;
int a[N],n;
int dp[N][2];
void solve(){
cin>>n;
long long sum=0;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
if(sum%2){
cout<<0<<"\n";
return;
}
memset(dp,0,sizeof dp);
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=1;j++){
dp[i][j]=(dp[i-1][j]+dp[i-1][(j+a[i])%2])%mod;
}
}
cout<<dp[n][0]<<"\n";
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
while(t--) solve();
return 0;
}
import java.io.*;
import java.util.*;
public class Main{
static final int N=1000+10,mod=1000000007;
static int[] a=new int[N];
static int[][] dp=new int[N][2];
static void solve(BufferedReader br)throws Exception{
int n=Integer.parseInt(br.readLine());
StringTokenizer st=new StringTokenizer(br.readLine());
long sum=0;
for(int i=1;i<=n;i++){
a[i]=Integer.parseInt(st.nextToken());
sum+=a[i];
}
if(sum%2==1){
System.out.println(0);
return;
}
for(int i=0;i<=n;i++){
dp[i][0]=dp[i][1]=0;
}
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=1;j++){
dp[i][j]=(dp[i-1][j]+dp[i-1][(j+a[i])%2])%mod;
}
}
System.out.println(dp[n][0]);
}
public static void main(String[] args)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int t=Integer.parseInt(br.readLine());
while(t-->0) solve(br);
}
}
import sys
input=sys.stdin.readline
mod=10**9+7
N=1010
for _ in range(int(input())):
n=int(input())
a=[0]+list(map(int,input().split()))
s=sum(a)
if s%2:
print(0)
continue
dp=[[0]*2 for _ in range(n+1)]
dp[0][0]=1
for i in range(1,n+1):
for j in range(2):
dp[i][j]=(dp[i-1][j]+dp[i-1][(j+a[i])%2])%mod
print(dp[n][0])
第三题
代码实现
参考实现
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int MOD=998244353;
int n,x;
int a[N];
int dp[N][70];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>x;
for(int i=1;i<=n;i++) cin>>a[i];
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=63;j++){
dp[i][j]=(dp[i-1][j]+dp[i-1][j^a[i]])%MOD;
}
}
cout<<dp[n][x]<<"\n";
return 0;
}
import java.io.*;
import java.util.*;
public class Main{
static final int N=100010;
static final int MOD=998244353;
static int[] a=new int[N];
static int[][] dp=new int[N][70];
public static void main(String[] args)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(br.readLine());
int n=Integer.parseInt(st.nextToken());
int x=Integer.parseInt(st.nextToken());
st=new StringTokenizer(br.readLine());
for(int i=1;i<=n;i++){
a[i]=Integer.parseInt(st.nextToken());
}
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=63;j++){
dp[i][j]=(dp[i-1][j]+dp[i-1][j^a[i]])%MOD;
}
}
System.out.print(dp[n][x]);
}
}
import sys
input=sys.stdin.readline
MOD=998244353
n,x=map(int,input().split())
a=[0]+list(map(int,input().split()))
dp=[[0]*70 for _ in range(n+1)]
dp[0][0]=1
for i in range(1,n+1):
for j in range(64):
dp[i][j]=(dp[i-1][j]+dp[i-1][j^a[i]])%MOD
print(dp[n][x])
第四题
代码实现
参考实现
#include<bits/stdc++.h>
using namespace std;
const int N=1e2+10;
int w[N],dp[N][100010];
int n;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
int sum=0;
for(int i=1;i<=n;i++){
cin>>w[i];
sum+=w[i];
}
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=sum;j++){
dp[i][j]|=dp[i-1][j];
dp[i][j]|=dp[i-1][abs(j-w[i])];
if(j+w[i]<=sum){
dp[i][j]|=dp[i-1][j+w[i]];
}
}
}
int ans=0;
for(int i=1;i<=sum;i++){
if(dp[n][i]) ans++;
}
cout<<ans;
return 0;
}
import java.io.*;
import java.util.*;
public class Main{
static final int N=110;
static int[] w=new int[N];
static int[][] dp=new int[N][100010];
public static void main(String[] args)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(br.readLine());
StringTokenizer st=new StringTokenizer(br.readLine());
int sum=0;
for(int i=1;i<=n;i++){
w[i]=Integer.parseInt(st.nextToken());
sum+=w[i];
}
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=sum;j++){
dp[i][j]|=dp[i-1][j];
dp[i][j]|=dp[i-1][Math.abs(j-w[i])];
if(j+w[i]<=sum){
dp[i][j]|=dp[i-1][j+w[i]];
}
}
}
int ans=0;
for(int i=1;i<=sum;i++){
if(dp[n][i]==1) ans++;
}
System.out.print(ans);
}
}
import sys
input=sys.stdin.readline
n=int(input())
w=[0]+list(map(int,input().split()))
s=sum(w)
dp=[[0]*100010 for _ in range(n+1)]
dp[0][0]=1
for i in range(1,n+1):
for j in range(s+1):
dp[i][j]|=dp[i-1][j]
dp[i][j]|=dp[i-1][abs(j-w[i])]
if j+w[i]<=s:
dp[i][j]|=dp[i-1][j+w[i]]
ans=0
for i in range(1,s+1):
if dp[n][i]:
ans+=1
print(ans)
第五题
代码实现
选和不选
#include<bits/stdc++.h>
using namespace std;
const int MOD=1e9+7;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n,k;
cin>>n>>k;
vector<int> dp(n+1);
dp[0]=1;
for(int i=1;i<=n;i++){
dp[i]=dp[i-1];
if(i-k-1>=1){
dp[i]=(dp[i]+dp[i-k-1])%MOD;
}else{
dp[i]=(dp[i-1]+1)%MOD;
}
}
cout<<dp[n]<<"\n";
return 0;
}
import java.io.*;
import java.util.*;
public class Main{
static final int MOD=1000000007;
public static void main(String[] args)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(br.readLine());
int n=Integer.parseInt(st.nextToken());
int k=Integer.parseInt(st.nextToken());
int[] dp=new int[n+1];
dp[0]=1;
for(int i=1;i<=n;i++){
dp[i]=dp[i-1];
if(i-k-1>=1){
dp[i]=(dp[i]+dp[i-k-1])%MOD;
}else{
dp[i]=(dp[i-1]+1)%MOD;
}
}
System.out.println(dp[n]);
}
}
MOD=10**9+7
n,k=map(int,input().split())
dp=[0]*(n+1)
dp[0]=1
for i in range(1,n+1):
dp[i]=dp[i-1]
if i-k-1>=1:
dp[i]=(dp[i]+dp[i-k-1])%MOD
else:
dp[i]=(dp[i-1]+1)%MOD
print(dp[n])
必须选第 i 个
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
const int MOD=1e9+7;
int n,k;
int dp[N],s[N];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>k;
int ans=1;
for(int i=1;i<=n;i++){
dp[i]=1;
if(i>k+1){
dp[i]=(dp[i]+s[i-k-1])%MOD;
}
s[i]=(s[i-1]+dp[i])%MOD;
ans=(ans+dp[i])%MOD;
}
cout<<ans;
return 0;
}
import java.io.*;
import java.util.*;
public class Main{
static final int N=1000000+10;
static final int MOD=1000000007;
static int[] dp=new int[N];
static int[] s=new int[N];
public static void main(String[] args)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(br.readLine());
int n=Integer.parseInt(st.nextToken());
int k=Integer.parseInt(st.nextToken());
int ans=1;
for(int i=1;i<=n;i++){
dp[i]=1;
if(i>k+1){
dp[i]=(dp[i]+s[i-k-1])%MOD;
}
s[i]=(s[i-1]+dp[i])%MOD;
ans=(ans+dp[i])%MOD;
}
System.out.print(ans);
}
}
MOD=10**9+7
n,k=map(int,input().split())
dp=[0]*(n+1)
s=[0]*(n+1)
ans=1
for i in range(1,n+1):
dp[i]=1
if i>k+1:
dp[i]=(dp[i]+s[i-k-1])%MOD
s[i]=(s[i-1]+dp[i])%MOD
ans=(ans+dp[i])%MOD
print(ans)
第六题
代码实现
参考实现
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n;
int a[N],dp[N];
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
dp[i]=0;
}
dp[1]=a[1];
for(int i=2;i<=n;i++){
dp[i]=max(dp[i-1],dp[i-2]+a[i]);
}
cout<<dp[n]<<"\n";
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--) solve();
return 0;
}
import java.io.*;
import java.util.*;
public class Main{
static final int N=200000+10;
static int[] a=new int[N];
static int[] dp=new int[N];
static void solve(BufferedReader br)throws Exception{
int n=Integer.parseInt(br.readLine());
StringTokenizer st=new StringTokenizer(br.readLine());
for(int i=1;i<=n;i++){
a[i]=Integer.parseInt(st.nextToken());
dp[i]=0;
}
dp[1]=a[1];
for(int i=2;i<=n;i++){
dp[i]=Math.max(dp[i-1],dp[i-2]+a[i]);
}
System.out.println(dp[n]);
}
public static void main(String[] args)throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int t=Integer.parseInt(br.readLine());
while(t-->0){
solve(br);
}
}
}
import sys
input=sys.stdin.readline
for _ in range(int(input())):
n=int(input())
a=[0]+list(map(int,input().split()))
dp=[0]*(n+1)
dp[1]=a[1]
for i in range(2,n+1):
dp[i]=max(dp[i-1],dp[i-2]+a[i])
print(dp[n])
第七题
代码实现
参考实现
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n;
int a[N],b[N];
int dp[N][3][3];
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++){
dp[i][1][0]=max(dp[i-1][0][1]+a[i],dp[i-1][0][2]+a[i]);
dp[i][2][0]=dp[i-1][1][0]+a[i];
dp[i][0][1]=max(dp[i-1][1][0]+b[i],dp[i-1][2][0]+b[i]);
dp[i][0][2]=dp[i-1][0][1]+b[i];
}
cout<<max({dp[n][0][1],dp[n][0][2],dp[n][1][0],dp[n][2][0]});
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
solve();
return 0;
}
import java.util.*;
public class Main{
static final int N=100000+10;
static int[] a=new int[N];
static int[] b=new int[N];
static int[][][] dp=new int[N][3][3];
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n=in.nextInt();
for(int i=1;i<=n;i++) a[i]=in.nextInt();
for(int i=1;i<=n;i++) b[i]=in.nextInt();
for(int i=1;i<=n;i++){
dp[i][1][0]=Math.max(dp[i-1][0][1]+a[i],dp[i-1][0][2]+a[i]);
dp[i][2][0]=dp[i-1][1][0]+a[i];
dp[i][0][1]=Math.max(dp[i-1][1][0]+b[i],dp[i-1][2][0]+b[i]);
dp[i][0][2]=dp[i-1][0][1]+b[i];
}
int ans=Math.max(
Math.max(dp[n][0][1],dp[n][0][2]),
Math.max(dp[n][1][0],dp[n][2][0])
);
System.out.print(ans);
}
}
import sys
input=sys.stdin.readline
n=int(input())
a=[0]+list(map(int,input().split()))
b=[0]+list(map(int,input().split()))
dp=[[[0]*3 for _ in range(3)] for _ in range(n+1)]
for i in range(1,n+1):
dp[i][1][0]=max(dp[i-1][0][1]+a[i],dp[i-1][0][2]+a[i])
dp[i][2][0]=dp[i-1][1][0]+a[i]
dp[i][0][1]=max(dp[i-1][1][0]+b[i],dp[i-1][2][0]+b[i])
dp[i][0][2]=dp[i-1][0][1]+b[i]
print(max(
dp[n][0][1],
dp[n][0][2],
dp[n][1][0],
dp[n][2][0]
))