POJ1157(动态规划)

解题思路:本题内容虽长,但很好理解。其实就是在矩阵(m*n)中找出在不同行不同列中m个数字的最大和。但还必须满足条件,关键在于后一行的(选中的)数所在的列必须大于该行(选中的)数所在的列。这是道经典的DP,状态转移方程为:dp[i][j]=max(dp[i][j-1], dp[i-1][j-1]+v[i][j]).
View Code
 1 #include<iostream>
 2 using namespace std;
 3 #define MAX 105
 4 #define max(a,b) ((a)>(b)?(a):(b))
 5 int v[MAX][MAX],dp[MAX][MAX];
 6 
 7 int main()
 8 {
 9     int m,n,i,j;
10     while(cin>>m>>n)
11     {
12         for(i=1;i<=m;i++)
13             for(j=1;j<=n;j++)
14                 cin>>v[i][j];
15             for(j=0;j<=n;j++)
16                 dp[0][j]=0;
17             for(i=1;i<=m;i++)
18                 dp[i][i]=dp[i-1][i-1]+v[i][i];
19             for(i=1;i<=m;i++)
20                 for(j=i+1;j<=n;j++)
21                     dp[i][j]=max(dp[i][j-1],dp[i-1][j-1]+v[i][j]);
22                 cout<<dp[m][n]<<endl;
23     }
24     return 0;
25 }
posted @ 2012-02-19 11:44  笑巧  阅读(774)  评论(0编辑  收藏  举报