您的位置:首页 > 其它

hdu 2571 命运(递推,请小心)

2014-06-25 21:07 204 查看
题目    

//不能广搜,会超内存
//可以用dp思想模拟
//map 后来保存的是 保存由前面推来的最大的幸运总值的点
//下标从1开始,不然倍数会有问题

//AC 代码:

AC代码

//不能广搜,会超内存
//可以用dp思想模拟
//temp 保存由前面推来的最大的幸运总值的点

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int main()
{
int t,n,m,i,j,k,map[25][1010];
int temp[25][1010];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
//一切要从1开始!!否则倍数有问题!!
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
}
}

//没有初始化?
memset(temp,-21000000,sizeof(temp));

temp[1][1]=map[1][1];
//(x,y+1)
for(j=2;j<=m;j++)
temp[1][j]=map[1][j]+temp[1][j-1];
//(x+1,y)
for(i=2;i<=n;i++)
temp[i][1]=map[i][1]+temp[i-1][1];
//(x,y*k)
for(j=2;j<=m;j++)
{
for(k=2;k<=m;k++)
{
if(j%k==0)
{
temp[1][j]=temp[1][j]>(map[1][j]+temp[1][j/k])? temp[1][j]:(map[1][j]+temp[1][j/k]);
}
}
}

for(i=2;i<=n;i++)
{
for(j=2;j<=m;j++)
{
//(x,y+1)
temp[i][j]=temp[i][j]>(map[i][j]+temp[i][j-1])? temp[i][j]:(map[i][j]+temp[i][j-1]);
//(x,y*k)
for(k=2;k<=m;k++)
{
if(j%k==0)
{
temp[i][j]=temp[i][j]>(map[i][j]+temp[i][j/k])? temp[i][j]:(map[i][j]+temp[i][j/k]);
}
}
//(x+1,y)
temp[i][j]=temp[i][j]>(map[i][j]+temp[i-1][j])? temp[i][j]:(map[i][j]+temp[i-1][j]);
}
}
printf("%d\n",temp
[m]);
}

return 0;
}


为什么这样分开写错呢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: