比赛时,没有想到用dp可以解决,结果。。。还是要多做题啊。
// [4/13/2014 Sjm] /* 状态: dp[i+1][j+1] := 第 i 幅画, 第 j 个画家所画完所话费的时间 *********************************************************************** 分析: 若第 j 个画家想要开始画第 i 幅画,则必须满足的两个条件是: 1) 第 j-1 个画家已经画完了第 i 幅画; 2) 第 j 个画家已经花完了第 i-1 幅画。 由此可得出,第 j 个画家画完第 i 幅画的时间。(决策也就在两个条件中产生了。) *********************************************************************** 决策: dp[i + 1][j + 1] = max(dp[i+1][j], dp[i][j + 1]) + arr[i][j];注意:数组作为全局变量,防止 Stack overflow */#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> using namespace std; const int MAX_M = 50000, MAX_N = 5; int dp[MAX_M + 1][MAX_N + 1], arr[MAX_M][MAX_N]; // 数组作为全局变量,防止 Stack overflow int main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); int m, n; scanf("%d %d", &m, &n); for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) scanf("%d", &arr[i][j]); int mytime = 0; memset(dp, 0, sizeof(dp)); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { dp[i + 1][j + 1] = max(dp[i + 1][j], dp[i][j + 1]) + arr[i][j]; } printf("%d ", dp[i + 1][n]); } return 0; }