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 }
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 }