命运
来源:互联网 发布:朝鲜怎样知乎 编辑:程序博客网 时间:2024/04/29 10:43
穿过幽谷意味着离大魔王lemon已经无限接近了!
可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关。要知道,不论何人,若在迷宫中被困1小时以上,则必死无疑!
可怜的yifenfei为了去救MM,义无返顾地跳进了迷宫。让我们一起帮帮执着的他吧!
命运大迷宫可以看成是一个两维的方格阵列,如下图所示:
yifenfei一开始在左上角,目的当然是到达右下角的大魔王所在地。迷宫的每一个格子都受到幸运女神眷恋或者痛苦魔王的诅咒,所以每个格子都对应一个值,走到那里便自动得到了对应的值。
现在规定yifenfei只能向右或者向下走,向下一次只能走一格。但是如果向右走,则每次可以走一格或者走到该行的列数是当前所在列数倍数的格子,即:如果当前格子是(x,y),下一步可以是(x+1,y),(x,y+1)或者(x,y*k) 其中k>1。
为了能够最大把握的消灭魔王lemon,yifenfei希望能够在这个命运大迷宫中得到最大的幸运值。
可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关。要知道,不论何人,若在迷宫中被困1小时以上,则必死无疑!
可怜的yifenfei为了去救MM,义无返顾地跳进了迷宫。让我们一起帮帮执着的他吧!
命运大迷宫可以看成是一个两维的方格阵列,如下图所示:
yifenfei一开始在左上角,目的当然是到达右下角的大魔王所在地。迷宫的每一个格子都受到幸运女神眷恋或者痛苦魔王的诅咒,所以每个格子都对应一个值,走到那里便自动得到了对应的值。
现在规定yifenfei只能向右或者向下走,向下一次只能走一格。但是如果向右走,则每次可以走一格或者走到该行的列数是当前所在列数倍数的格子,即:如果当前格子是(x,y),下一步可以是(x+1,y),(x,y+1)或者(x,y*k) 其中k>1。
为了能够最大把握的消灭魔王lemon,yifenfei希望能够在这个命运大迷宫中得到最大的幸运值。
每组测试数据的第一行是两个整数n,m,分别表示行数和列数(1<=n<=20,10<=m<=1000);
接着是n行数据,每行包含m个整数,表示n行m列的格子对应的幸运值K ( |k|<100 )。
13 89 10 10 10 10 -10 10 1010 -11 -1 0 2 11 10 -20-11 -11 10 11 2 10 -10 -10
52
两种不同递推公式的选择:1.根据前面的位置得到现在的位置 2.根据现在的位置得到后面的位置
第一种递推公式需要注意,
dp[i][j]=max(dp[i][j],dp[i-1][j]);dp[i][j]=max(dp[i][j],dp[i][j-1]);不能这样更新现在的位置,dp[i][j]被初始化为0,若dp[i-1][j]和dp[i][j-1]都是一个极小的数,那么dp[i][j]就不会得到它们的值,从而发生错误
正解:
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
#include<stdio.h>#include<string.h>#include<algorithm>#define maxn 25#define maxm 1005using namespace std;const int _min=-2e8;int main(){int c;scanf("%d",&c);while(c--){ int an[maxn][maxm]={0},dp[maxn][maxm]={0},n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&an[i][j]); for(int i=0;i<=n;i++) dp[i][0]=_min; for(int i=0;i<=m;i++) dp[0][i]=_min; dp[0][1]=dp[1][0]=0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) { dp[i][j]=max(dp[i][j-1],dp[i-1][j]); for(int k=2;k<=j;k++) { if(j%k==0) dp[i][j]=max(dp[i][j],dp[i][j/k]); } dp[i][j]+=an[i][j]; }}printf("%d\n",dp[n][m]);}return 0;}第二种方法比第一种好想,而且更快,不存在上面出现的问题(但是要把dp数组初始化为一个极小的负数),在向下走的时候直接由它上面位置的值得到而不是取max
#include<stdio.h>#include<string.h>#include<algorithm>#define maxn 25#define maxm 1005using namespace std;const int _min=-2e8;int main(){int c;scanf("%d",&c);while(c--){ int an[maxn][maxm]={0},dp[maxn][maxm]={0},n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&an[i][j]);dp[i][j]=_min;} dp[1][1]=an[1][1];for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) { if(i+1<=n) dp[i+1][j]=dp[i][j]+an[i+1][j];if(j+1<=m)dp[i][j+1]=max(dp[i][j]+an[i][j+1],dp[i][j+1]); for(int k=2;k*j<=m;k++) { dp[i][j*k]=max(dp[i][j]+an[i][j*k],dp[i][j*k]); } }}printf("%d\n",dp[n][m]);}return 0;}
阅读全文
0 0
- 命运
- 命运
- 命运
- 命运
- 命运
- 命运
- 命运
- 命运
- 命运
- 命运
- 命运
- 命运
- 命运
- 命运
- 命运
- 命运
- 命运
- 命运
- hdu1874 畅通工程续
- 常见服务器向用户返回的状态码和提示信息
- javaScript中的instanceOf的用法
- 代理模式的实际运用-以mybatis拦截器实现原理为例
- C#中ShowDialog() == DialogResult.OK
- 命运
- 欧拉函数【模板】
- 构造函数为什么不能为虚函数
- mysql 更新本表触发器
- c++中enum 如何使用
- Jquery Md5加密-Jquery.md5.js
- 米目米当选中国智能制造系统解决方案供应商联盟理事单位
- intellij idea实现java通过JDBC连接mysql中错误解决
- 关于typedef的用法总结