POJ 2948 - 典型动态规划

题目:http://poj.org/problem?id=2948

 

解决方法:

动态规划。另dp[i][j]表示子矩阵 0-i行,0-j列的最优方案的值,则状态转移方程为:dp[i][j] = max(dp[i][j-1] + sumNor[i][j], dp[i-1][j]+sumWes[i][j])。意思是,当前格子i,j有两种决策,第一,选择向北的传送带;第二,选择向西的传送带。选择向北的传送带,则问题的解由格子i,j-1的最优解加上向北传送带上获得的资源的总和sumNor[i][j];选择向西传送带的同理。

 

代码如下:

#include <iostream> #include <memory> #include <cmath> using namespace std; const int MAXN = 501; int yeye[MAXN][MAXN]={0}; int blog[MAXN][MAXN]={0}; int dp[MAXN][MAXN]={0}; int sumNor[MAXN][MAXN]={0}; int sumWes[MAXN][MAXN]={0}; int main() { while(1){ int n,m; std::cin >> n >> m; if (n==0 || m==0) break; memset(yeye, 0, sizeof(yeye)); memset(blog, 0, sizeof(blog)); memset(sumNor, 0, sizeof(sumNor)); memset(sumWes, 0, sizeof(sumWes)); memset(dp, 0, sizeof(dp)); for (int i=0; i<n; i++) { for (int j=0; j<m; j++) { std::cin >> yeye[i][j]; } } for (int i=0; i<n; i++) { for (int j=0; j<m; j++) std::cin >> blog[i][j]; } for (int i=0; i<n; i++) { for (int j=0; j<m; j++) { for (int k=0; k<=i; k++) sumNor[i][j]+=blog[k][j]; for (int k=0; k<=j; k++) sumWes[i][j]+=yeye[i][k]; } } for (int i=0; i<n; i++) { for (int j=0; j<m; j++) { dp[i][j] = max(dp[i][j-1] + sumNor[i][j], dp[i-1][j] + sumWes[i][j]); } } std::cout << dp[n-1][m-1] << std::endl; } return 0; } 

 

你可能感兴趣的:(POJ 2948 - 典型动态规划)