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

时间:2023-03-09 08:27:50
hdu 2571 命运(递推,请小心)

题目    

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

//AC 代码:

AC代码
//不能广搜,会超内存
//可以用dp思想模拟
//map 后来保存的是 保存由前面推来的最大的幸运总值的点
//下标从1开始,不然倍数会有问题
//又错了那么多次。。。
//重写。。。
//求过!!! #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int t,n,m,i,j,k,map[][];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m); memset(map,-,sizeof(map)); for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
scanf("%d",&map[i][j]);
}
} for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
int maxx=-;
for(k=;k<=m;k++)
{
if(j%k==)
{
maxx=maxx>map[i][j/k]? maxx:map[i][j/k];
}
}
if(maxx<map[i-][j])maxx=map[i-][j];
if(maxx<map[i][j-])maxx=map[i][j-];
if(!(i==&&j==))
map[i][j]+=maxx;
}
} printf("%d\n",map[n][m]);
} return ;
}

//模拟时最好不要分开,因为我分开写错了——求高人指点为什么我分开写错掉了,明明思路是一样的啊

//错掉的代码:

//不能广搜,会超内存
//可以用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[][];
int temp[][];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
//一切要从1开始!!否则倍数有问题!!
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
scanf("%d",&map[i][j]);
}
} //没有初始化?
memset(temp,-,sizeof(temp)); temp[][]=map[][];
//(x,y+1)
for(j=;j<=m;j++)
temp[][j]=map[][j]+temp[][j-];
//(x+1,y)
for(i=;i<=n;i++)
temp[i][]=map[i][]+temp[i-][];
//(x,y*k)
for(j=;j<=m;j++)
{
for(k=;k<=m;k++)
{
if(j%k==)
{
temp[][j]=temp[][j]>(map[][j]+temp[][j/k])? temp[][j]:(map[][j]+temp[][j/k]);
}
}
} for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
//(x,y+1)
temp[i][j]=temp[i][j]>(map[i][j]+temp[i][j-])? temp[i][j]:(map[i][j]+temp[i][j-]);
//(x,y*k)
for(k=;k<=m;k++)
{
if(j%k==)
{
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-][j])? temp[i][j]:(map[i][j]+temp[i-][j]);
}
}
printf("%d\n",temp[n][m]);
} return ;
}

为什么这样分开写错呢