wikioi 1169 传纸条 (2008年NOIP全国联赛提高组)
题目:
http://wikioi.com/problem/1169/
分析:DP[i1][j1][i2][j2]中相当于保存了DP[i1][j1]和DP[i2][j2]之和,即第一条路线走到(i1,j1)处,第二条路线走到(i2,j2)处时,所经过地点的数值之和的最大值。
#include <iostream>#include <algorithm>#include <cstring>using namespace std;int m,n;int a[55][55];int dp[55][55][55][55];int main(){ cin >> m >> n; memset(dp, 0, sizeof(dp)); for(int i=1; i<=m; i++) for(int j=1; j<=n; j++) cin >> a[i][j]; for(int i1=1; i1<=m; i1++) { for(int j1=1; j1<=n; j1++) { for(int i2=1; i2<=m; i2++) { for(int j2=1; j2<=n; j2++) { int maxV = max(max(dp[i1-1][j1][i2-1][j2], dp[i1-1][j1][i2][j2-1]), max(dp[i1][j1-1][i2-1][j2], dp[i1][j1-1][i2][j2-1])); if(i1==i2 && j1==j2) dp[i1][j1][i2][j2] = a[i1][j1] + maxV; else dp[i1][j1][i2][j2] = a[i1][j1] + a[i2][j2] + maxV; } } } } cout << dp[m][n][m][n]; return 0;}
上述为四层循环实现,也可优化为三层循环。参考下面的链接:
http://blog.csdn.net/bo_jwolf/article/details/9745523
http://wikioi.com/solution/list/1169/