第0秒 5
第1秒 4 5 6
第2秒 3 4 5 6 7
第3秒 2 3 4 5 6 7 8
第4秒 1 2 3 4 5 6 7 8 9
第5秒 0 1 2 3 4 5 6 7 8 9 10
第6秒 0 1 2 3 4 5 6 7 8 9 10
第1秒 4 5 6
第2秒 3 4 5 6 7
第3秒 2 3 4 5 6 7 8
第4秒 1 2 3 4 5 6 7 8 9
第5秒 0 1 2 3 4 5 6 7 8 9 10
第6秒 0 1 2 3 4 5 6 7 8 9 10
用数组dp[i][j]来表示第i秒gameboy在j位置上,那么就可以得出它的状态转移方程为:
①当j==0时:
dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]);
②当j==10时:
dp[i][j]+=max(dp[i+1][j],dp[i+1][j-1]);
③当j>0&&j<10时:dp[i][j]+=max(max(dp[i+1][j],dp[i+1][j-1]),dp[i+1][j+1])。
③当j>0&&j<10时:dp[i][j]+=max(max(dp[i+1][j],dp[i+1][j-1]),dp[i+1][j+1])。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[100005][15];
int main(){
int i,j,n,cnt;
int x,t;
while(scanf("%d",&n),n){
memset(dp,0,sizeof(dp));//初始化
cnt=0;
for(i=1;i<=n;i++){
scanf("%d%d",&x,&t);
cnt=max(t,cnt);//记录最大的时间
dp[t][x]++;//将第i秒位置j加1,记录各个位置掉馅饼的个数
}
for(i=cnt-1;i>=0;i--){//从下往上
for(j=0;j<=10;j++){
if(j==0)
dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]);
else if(j==10)
dp[i][j]+=max(dp[i+1][j],dp[i+1][j-1]);
else
dp[i][j]+=max(max(dp[i+1][j],dp[i+1][j-1]),dp[i+1][j+1]);
}
}
printf("%d\n",dp[0][5]);//起点(即反向的终点)
}
return 0;
}
第0秒
第1秒
第2秒
第3秒
第4秒
第5秒
第6秒
在这款趣味问题中,游戏男孩必须收集尽可能多的从天而降的馅饼。通过构建一个动态规划模型,我们解决了如何最大化收集到的馅饼数量的问题。
2857

被折叠的 条评论
为什么被折叠?



