您的位置:首页 > 其它

hdu2571 命运

2011-05-19 17:21 204 查看
悲剧,被这个名为命运的题目玩了几个小时,过掉正数数据但是过不掉负数数据,ORZ。。改了好久。。。其实就是DP,ans[i][j]表示到第(i, j)点的最大幸运点,然后就可以依照题目列出转移方程

ans[i][k*j] = max( ans[i][k*j],ans[i][j]+maze[i][k*j]);(向右走k*j步)、ans[i][j+1] = max(ans[i][j+1], ans[i][j]+maze[i][j+1]);(向右走一步)和ans[i+1][j] = ans[i][j]+maze[i+1][j]; (向下走一步)。。。。

#include <iostream>
using namespace std;
int main()
{
int n, m;
int t;
int maze[30][1100];
scanf("%d", &t);
while (t --){
scanf("%d %d", &n, &m);
int ans[30][1100];
int ak = 0;
for (int i = 1; i <= n; i ++){
for (int j = 1; j <= m;j ++){
ans[i][j] = -0xfffff;
scanf("%d", &maze[i][j]);
}
}
ans[1][1] = maze[1][1];
for (int i = 1; i <= n; i ++){
for (int j = 1; j <= m; j ++){
for (int k = 2; k*j <= m; k ++){
if (k*j>=1&&k*j<=m)
ans[i][k*j] = max( ans[i][k*j],ans[i][j]+maze[i][k*j]);
}
if (j+1>=1&&j+1<=m)
ans[i][j+1] = max(ans[i][j+1], ans[i][j]+maze[i][j+1]);
}
for (int j = 1; j <= m; j ++){
ans[i+1][j] = ans[i][j]+maze[i+1][j];
}
}
printf("%d/n", ans
[m]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: