POJ 1157 LITTLE SHOP OF FLOWERS
题目描述:
http://poj.org/problem?id=1157
思路:
也是属于经典的dp,我只做做水题哈。
它这种情况跟最长公共子串的长度(字串要求连续)是一样的。有一点不同,因为它
要求必须有花插入,所以不能不选,那么如果有5个位置,有3种花,那么第二种
花,插入的位置必定是从[2,4],因为如果你插到1,那么第一种花就没地方放了,所以
循环的上下界要搞清楚。
dp[i][j] = max(dp[i-1][k] + dp[i][j]), {k是符合要求的位置}
最后遍历一遍最后插入花的值,最大的就是它的最大观赏价值,这种dp是不包含的。
代码:
View Code
1 #include <iostream> 2 using namespace std; 3 4 int dp[105][105]; 5 int main() 6 { 7 8 int F, V, i, j, max; 9 while(cin >> F >> V) 10 { 11 for(i = 1; i <= F; i++) 12 for(j = 1; j <= V; j++) 13 cin >> dp[i][j]; 14 for(i = 2; i <= F; i++) 15 for(j = i; j <= V + i - F; j++) 16 { 17 max = -1000; 18 for(int k = i-1; k < j; k++) 19 max = max > dp[i-1][k] ? max : dp[i-1][k]; 20 dp[i][j] += max; 21 } 22 // for(i = 1; i <= F; i++) 23 // { 24 // for(j = 1; j <= V; j++) 25 // cout << dp[i][j] << " "; 26 // cout << endl; 27 // } 28 max = -1000; 29 for(j = F; j <= V; j++) 30 max = max > dp[F][j] ? max : dp[F][j]; 31 cout << max << endl; 32 } 33 return 0; 34 }