http://poj.org/problem?id=3230
同样是一道DP的题,但是这道题确实想了很久,还是在staginner大牛的提醒下
才想出来的,题目给的数据有ex[i][j]从i到j城市的花费,inc[i][j]为第i天在j城市的收入。
状态转移方程为:f[i][j] =max( f[i-1][k] + inc[i][j] – ex[k][j] ). 其中f[i][j]代表的是第i天
呆在j城所获到的最大收入。再遍历一遍求的的f值就知道m天呆在哪个城市的收入最大了!
/*
Problem: 3230 User: CSU_ACM1174
Memory: 304K Time: 16MS
Language: C++ Result: Accepted
*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
const int MAXD = 105;
int inc[MAXD][MAXD], ex[MAXD][MAXD];
int f[MAXD][MAXD];
int n, m, Max;
int max( int a, int b)
{
return a > b ? a : b;
}
void init()
{
for( int i = 1; i <= n; i ++)
for( int j = 1; j <= n; j ++)
scanf( "%d", &ex[i][j]); //i到j的花费
for( int i = 1; i <= m; i ++)
for( int j = 1; j <= n; j ++)
scanf( "%d", &inc[i][j]); //第i天在j的收入
memset( f, 0, sizeof f);
}
void dp()
{
for( int j = 1; j <= n; j ++)
f[1][j] = inc[1][j] - ex[1][j];
for( int i = 2; i <= m; i ++)
for( int j = 1; j <= n; j ++)
for( int k = 1; k <= n; k ++)
f[i][j] = max( f[i][j], f[i - 1][k] + inc[i][j] - ex[k][j]);
Max = 0;
for( int i = 1; i <= n; i ++)
if( Max < f[m][i]) Max = f[m][i];
}
int main()
{
while( scanf( "%d%d", &n, &m) == 2)
{
if( n == m && m == 0) break;
init();
dp();
printf( "%d\n", Max);
}
return 0;
}
浙公网安备 33010602011771号