题意:有n束花m个花瓶,m >= n,现在要把这n束花放花瓶里,可以有空花瓶,但是花的相对顺序必须按序号,告诉每束花放在不同花瓶里的价值,求能获得的最大价值。
解法:dp。考虑dp[i][j]为前i束花放前j个花瓶的最高价值,则有状态转移方程:dp[i][j] = max(dp[i][j - 1], dp[i - 1][j - 1] + a[i][j]),前一个状态dp[i][j - 1]表示第j个花瓶是空瓶,后一个状态dp[i - 1][j - 1] + a[i][j]表示第j个花瓶里放第i束花,需要判断i和j的关系,如果i和j相等则不存在第一个状态,因为花瓶里必须有花。
代码:
#include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #include<limits.h> #include<time.h> #include<stdlib.h> #include<map> #include<queue> #include<set> #include<stack> #include<vector> #define LL long long using namespace std; int main() { int n, m; while(~scanf("%d%d", &n, &m)) { int dp[105][105] = {0}; int a[105][150] = {0}; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) { scanf("%d", &a[i][j]); } for(int i = 1; i <= n; i++) for(int j = i; j <= m; j++) { if(j > i) dp[i][j] = max(dp[i][j - 1], dp[i - 1][j - 1] + a[i][j]); else dp[i][j] = dp[i - 1][j - 1] + a[i][j]; } cout << dp[n][m] << endl; } return 0; }