题目链接:HDU 2571 命运
dp。
状态转移方程:dp[i][j] = max(dp[i - 1][j],dp[j][k]) + value[i][j],k = j - 1 或者 j % k = 0。
这个题是存在负值的,所以初始化不能把dp全赋为0。
#include <iostream>
using namespace std;
const int MAX_N = 20 + 3;
const int MAX_M = 1000 + 100;
const int inf = (1 << 30);
int dp[MAX_N][MAX_M],arr[MAX_N][MAX_M];
int T,n,m;
int main()
{
cin >> T;
while(T--)
{
cin >> n >> m;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
cin >> arr[i][j];
dp[i][j] = -inf;
}
}
dp[1][1] = arr[1][1];
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
if(i == 1 && j == 1)
continue;
if(i > 1)
dp[i][j] = dp[i - 1][j];
for(int k = 1;k < j;k++)
{
if(k == j - 1 || j % k == 0)
{
dp[i][j] = max(dp[i][j],dp[i][k]);
}
}
dp[i][j] += arr[i][j];
}
}
cout << dp[n][m] << endl;
}
return 0;
}