杭电2571 命运
/*

题意:从(1,1)点到(n,m)点,求最大命运值
解法:
DP问题,dp[i][j]表示(i,j)的最大命运值,从(1,1)到(n,m)一直算下去,dp[n][m]即为所求
状态转移方程 dp[i][j]=MAX(dp[i][j/k],dp[i-1][j],dp[i][j-1])+value[i][j]
*/
#include<stdio.h>
#include<math.h>
int map[25][1005];
int dp[25][10005];
int getMax(int a,int b)
{
return a>b?a:b;
}
int main()
{
int C,n,m,i,j;
scanf("%d",&C);
while(C--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&map[i][j]);
dp[1][1]=map[1][1];
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(i==1&&j==1)
continue;
int max=-99999999;
for(int p=2;p<=j;p++)
if(j%p==0)
max=getMax(max,dp[i][j/p]);
if(j>1)
max=getMax(max,dp[i][j-1]);
if(i>1)
max=getMax(max,dp[i-1][j]);
dp[i][j]=max+map[i][j];
}
/* for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
printf("%d ",dp[i][j]);
if(j==m)
printf("\n");
}
*/
printf("%d\n",dp[n][m]);
}
return 0;
}
#include<math.h>
int map[25][1005];
int dp[25][10005];
int getMax(int a,int b)
{
return a>b?a:b;
}
int main()
{
int C,n,m,i,j;
scanf("%d",&C);
while(C--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&map[i][j]);
dp[1][1]=map[1][1];
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(i==1&&j==1)
continue;
int max=-99999999;
for(int p=2;p<=j;p++)
if(j%p==0)
max=getMax(max,dp[i][j/p]);
if(j>1)
max=getMax(max,dp[i][j-1]);
if(i>1)
max=getMax(max,dp[i-1][j]);
dp[i][j]=max+map[i][j];
}
/* for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
printf("%d ",dp[i][j]);
if(j==m)
printf("\n");
}
*/
printf("%d\n",dp[n][m]);
}
return 0;
}