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 }
posted @ 2012-04-22 13:08  可乐爱上了雪碧  阅读(167)  评论(0编辑  收藏  举报