Example: Hdu 2571 “命运” http://acm.hdu.edu.cn/showproblem.php?pid=2571
解:类似“装配线调度问题”,构造转移方程——当前的最优解依赖前一个最优解的选择,整体的最优解的局部也是最优的。
#include <iostream>
using namespace std;
template<class T>
T max(T &a,T &b)
{
return a>b?a:b;
}
int main()
{
int maze[25][1005];
int sum[25][1005];
int t,n,m;
cin >> t;
while(t--)
{
cin >> n >> m; // n行m列
memset(maze, 0, sizeof(maze));
memset(sum, 0, sizeof(sum));
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin >> maze[i][j];
// 二维空间里的动态规划,注意顺序一定要保证子问题已经最优化
for(i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
int temp = 0;
if(i==1 && j==1)
{
sum[1][1] = maze[1][1];
continue;
}
if(i==1)
temp = sum[i][j-1];
else if(j==1)
temp = sum[i-1][j];
else
temp = max(sum[i-1][j], sum[i][j-1]);
// j%k
for(int k=1; k<=j/2; k++)
if(j%k == 0)
temp = max(temp, sum[i][k]);
sum[i][j] = temp + maze[i][j];
}
cout << sum[n][m] << endl;
}
return 0;
}
// 实际上,maze和sum可以合二为一