借鉴了别人的思路:
1、dp[i][j] = 第i秒走了移动j次所接到的苹果的数目
2、dp[i][j] = max(dp[i-1][j-1]+dp[i-1][j])+(第i秒接到的苹果数目)
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>
#include<iostream>
#include<map>
#include<set>
#include<math.h>
using namespace std;
#define MAX_A 10000
int dp[1010][33];
int main(){
int n;
int t,s;
scanf("%d %d",&t,&s);
for(int i=0;i<=t;i++){
for(int j=0;j<=min(i,s);j++){
dp[i][j] = 0;
}
}
for(int i=1;i<=t;i++){
int a;
scanf("%d",&a);
dp[i][0] = dp[i-1][0]+(2-a);
for(int j=1;j<=min(i,s);j++){
dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]);
if(j%2==1&&a==2){
dp[i][j]++;
}else if(j%2==0&&a==1){
dp[i][j]++;
}
}
}
int ans = 0;
for(int i=0;i<=s;i++){
ans = max(ans,dp[t][s]);
}
printf("%d\n",ans);
return 0;
}
ps:
尽量将数组开在主函数外
将数组开在主函数内部,结果变得很奇怪:
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>
#include<iostream>
#include<map>
#include<set>
#include<math.h>
using namespace std;
#define MAX_A 10000
int main(){
int n;
int t,s;
scanf("%d %d",&t,&s);
int dp[t+2][s+2];
for(int i=0;i<=t;i++){
for(int j=0;j<=min(i,s);j++){
dp[i][j] = 0;
}
}
for(int i=1;i<=t;i++){
int a;
scanf("%d",&a);
dp[i][0] = dp[i-1][0]+(2-a);
for(int j=1;j<=min(i,s);j++){
dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]);
if(j%2==1&&a==2){
dp[i][j]++;
}else if(j%2==0&&a==1){
dp[i][j]++;
}
}
}
int ans = 0;
for(int i=0;i<=s;i++){
ans = max(ans,dp[t][s]);
}
printf("%d\n",ans);
return 0;
}