大致题意:
有一位旅行者想在n个城市中旅行m天,旅行从一个城市到另一个城市需要一定的花费,到一个城市又可以得到钱,但这个钱会随着时间变化,现在求最大利润。
数据范围n,m<100
很容易想到dp
f[i][j]表示第i天到城市j的最大利润
转移方程 f[i][j] = max( f[i-1][k] - cost[k][j] + earn[i][j] )
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <cstdlib>
#include <algorithm>
#include <iostream>
using namespace std;
int n,m;
int f[110][110];
int c[110][110];
int w[110][110];
int main()
{
while(scanf("%d%d",&n,&m))
{
if(n == 0 && m == 0)
break;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
scanf("%d",&c[i][j]);
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
scanf("%d",&w[i][j]);
memset(f,195,sizeof(f));
for(int i = 1; i <= n; i++)
f[1][i] = w[1][i] - c[1][i];
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] + w[i][j] - c[k][j]);
int ans = f[0][0];
for(int i = 1; i <= n; i++)
if(ans < f[m][i])
ans = f[m][i];
cout << ans << endl;
}
return 0;
}