hdu2571
dp入门问题
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
long long int a[21][1005],dp[21][1005];
int main()
{
int i,j,n,m,c;
cin>>c;
while(c--)
{
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
cin>>a[i][j];//输入
}
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
dp[i][j] = -1000000000;//把数组dp初始化为最小值
dp[1][1]=a[1][1];
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
for(int k=1;k<j;k++)
{
if(j%k==0)//表示j是k的倍数
dp[i][j]=max(dp[i][j],dp[i][k]+a[i][j]);//(i,j*k)的情况
}
dp[i][j] = max(dp[i][j],dp[i][j-1]+a[i][j]);//(i+1,j)的情况
dp[i][j] = max(dp[i][j],dp[i-1][j]+a[i][j]);//(i,j+1)的情况
}
}//通过把对于(i j)最好的情况(目前最大的值)表示出来从而求出最后一个
cout<<dp[n][m]<<endl;
}
return 0;
} //可以参照hdu2084数塔问题
我的数塔问题链接hdu2084