题意:有s个月,c个城市,给出第几个月在第几个城市举办演唱会的收益,并且给出从一个城市到另一个城市的成本,求最大的收益。到达第一个城市不需要成本。
用dp[i][j]表示第j个月在第i个城市举办演唱会可以得到的最大收益。
dp[i][j] = max(dp[i][j], dp[k][j - 1] + id[i][j] - mp[k][i]);k是上个月举办演唱会的城市。
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int INF = 0x3f3f3f3f; int mp[111][111]; int id[111][111]; int dp[111][111]; int main() { int t, n, m, i, j, k; scanf("%d", &t); while(t--) { scanf("%d%d", &n, &m); for(i = 1; i <= n; i++) { for(j = 1; j <= m; j++) { scanf("%d", &id[i][j]); } } for(i = 0; i <= n; i++) for(j = 0; j<= m; j++) dp[i][j] = -INF; for(i = 1; i <= n; i++) { for(j = 1; j <= n; j++) scanf("%d", &mp[i][j]); } for(i = 1; i <= n; i++) dp[i][1] = id[i][1]; for(j = 2; j <= m; j++) { for(i = 1; i <= n; i++) { for(k = 1; k <= n; k++) { dp[i][j] = max(dp[i][j], dp[k][j - 1] + id[i][j] - mp[k][i]); } } } int ans = -INF; for(i = 1; i <= n; i++) ans = max(ans, dp[i][m]); printf("%d\n", ans); } return 0; }