乌龟棋
来源:互联网 发布:mac adobe flash过期 编辑:程序博客网 时间:2024/04/27 22:19
朴素搜索 30分 tle
#include<cstdio>#include<iostream>using namespace std;int n,m;int q;int dp[99999];int a[999999];int f[1999];int max1=-9999999;void dfs(int x,int a,int b,int c,int d,int ans){ if(x==n) { max1=max(max1,ans);//修改结果 return ; } if(a&&x+1<=n) dfs(x+1,a-1,b,c,d,ans+dp[x+1]); if(b&&x+2<=n) dfs(x+2,a,b-1,c,d,ans+dp[x+2]); if(c&&x+3<=n) dfs(x+3,a,b,c-1,d,ans+dp[x+3]); if(d&&x+4<=n) dfs(x+4,a,b,c,d-1,ans+dp[x+4]);//四个方向}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&dp[i]); } for(int i=1;i<=m;i++) { int x; scanf("%d",&x); f[x]++; } dfs(1,f[1],f[2],f[3],f[4],dp[1]); printf("%d",max1); return 0;}
记忆化搜索
#include<cstdio>#include<iostream>using namespace std;int n,m;int q;int dp[99999];int a[999999];int f[1999];int max1=-9999999;int dpp[40][40][40][40];//dpint dfs(int x,int a,int b,int c,int d){ if(x==n) { return 0; } if(a) dpp[a][b][c][d]= max(dpp[a][b][c][d], (dpp[a-1][b][c][d]? dpp[a-1][b][c][d]: dfs(x+1,a-1,b,c,d))+ dp[x+1]); if(b) dpp[a][b][c][d]= max(dpp[a][b][c][d], (dpp[a][b-1][c][d]? dpp[a][b-1][c][d]: dfs(x+2,a,b-1,c,d))+ dp[x+2]); if(c) dpp[a][b][c][d]= max(dpp[a][b][c][d], (dpp[a][b][c-1][d]? dpp[a][b][c-1][d]: dfs(x+3,a,b,c-1,d))+ dp[x+3]); if(d) dpp[a][b][c][d]= max(dpp[a][b][c][d], (dpp[a][b][c][d-1]? dpp[a][b][c][d-1]: dfs(x+4,a,b,c,d-1))+ dp[x+4]); return dpp[a][b][c][d];}//四个方向记忆化搜索int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&dp[i]); } for(int i=1;i<=m;i++) { int x; scanf("%d",&x); f[x]++; } printf("%d",dfs(1,f[1],f[2],f[3],f[4])+dp[1]);//加上第一个位置的 return 0;}
动规代码
#include<cstdio>#include<iostream>using namespace std;int n,m;int q;int dp[99999];int a[999999];int f[1999];int max1=-9999999;int dpp[40][40][40][40];//dpint main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&dp[i]); } for(int i=1;i<=m;i++) { int x; scanf("%d",&x); f[x]++; } dpp[0][0][0][0]=dp[1]; for(int i=0;i<=f[1];i++) for(int j=0;j<=f[2];j++) for(int k=0;k<=f[3];k++) for(int q=0;q<=f[4];q++) { dpp[i][j][k][q]= max(dpp[i-1][j][k][q], max(dpp[i][j-1][k][q], max(dpp[i][j][k-1][q], dpp[i][j][k][q-1]))) +dp[1+i*1+j*2+k*3+q*4];//取这几张牌走到的地址 } printf("%d",dpp[f[1]][f[2]][f[3]][f[4]]); return 0;}
这题我一开始写的动规,不过错了。。。。
思路应该对,可代码错了,我就按搜索->记忆化搜索->动规的方式做的才做出来
1 0
- 乌龟棋
- 乌龟棋
- 乌龟棋
- 乌龟棋
- 乌龟棋
- 乌龟棋
- 乌龟棋
- 乌龟棋
- 乌龟棋
- 乌龟棋
- 乌龟棋
- 乌龟棋
- 乌龟棋
- NOIP-2010 乌龟棋
- wikioi 1068 乌龟棋
- wikioi 1068 乌龟棋
- HOJ 3140 乌龟棋
- NOIP2010乌龟棋
- 使用 FUSE 开发自己的文件系统
- Android学习--收集别人博客
- EditText实现点击hint值动画到左上角,Design包下InputTextLayout
- 【iOS沉思录】UITableView的重用机制与加载优化详解
- C# 单选按钮
- 乌龟棋
- redis 命令总结
- 京东MySQL数据库主从切换自动化
- AngularJs之ngModel中$parsers和$formatters随笔
- django关于csrf防止跨站的ajax请求403处理
- UIScrollView顶部留有64的空白
- spring(5)---bean的3种实例化方式
- Linux命令---链接命令
- 仿iOS中弹框气泡菜单的控件