好久没有做题目了,最近刚开始玩ubuntu爱不释手啊。导致我的A题大业都停滞不前啊,还好今天终于有接着做题了。今天早上看了这个POJ3230一推敲是一个动归题,状态也很好确定
f[i][j]表示第i天在第j个城市能得到的最多的钱。但是还是wa了好多次,好桑心啊。原来是因为第一天的情况没有考虑清楚,第一天肯定是从第一个城市出发的,所以上一个城市的起始点肯定是第一个城市,已经无需遍历了。而以后的几天之需要遍历前一天所在的城市,每次都得出最优值就可以了。代码上可以做一个空间的优化,我嫌麻烦就没有优化。
题目链接:点击打开链接
/*Source Code
Problem: 3230 User: Bearox
Memory: 528K Time: 16MS
Language: G++ Result: Accepted
Source Code*/
#include<cstdio>
#include<cstring>
#define N 105
int exp[N][N], inc[N][N], f[N][N];
int main()
{
int n, m;
int i, j, k;
while(scanf("%d%d", &n, &m) != EOF)
{
if(n == 0 && m == 0) return 0;
for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j)
scanf("%d", &exp[i][j]);
for(i = 1; i <= m; ++i)
for(j = 1; j <= n; ++j)
scanf("%d", &inc[i][j]);
memset(f, 0, sizeof(f));
for(i = 1; i <= m; ++i)
{
for(j = 1; j <= n; ++j)
{
if(i == 1) {f[i][j] = inc[i][j] - exp[1][j]; continue;}
int max = f[i - 1][1] - exp[1][j];
for(int k = 2; k <= n; ++k)
max = f[i - 1][k] - exp[k][j] > max? f[i - 1][k] - exp[k][j] : max;
f[i][j] = max + inc[i][j];
}
}
int max = f[m][1];
for(j = 2; j <= n; ++j)
max = f[m][j] > max? f[m][j] : max;
printf("%d\n", max);
}
return 0;
}