題目大意:有F束花和V个花瓶,把F束花放在V个花瓶里面,一个花瓶放一束,要求是第i束必须放在第j束前面(i<j)。为了美学,花瓶和花对应有个美学值,如下图,把azaleas放在第2号花瓶,美学值为23,很漂亮;而把azaleas放在4号花瓶,美学值为-24,很丑。求一种放法,使得美学值总和最大。
DP问题。设maxAes[i,j]为前i束花插在前j个花瓶中的最大美学值,则:
maxAes[i,j]=max(maxAes[i-1,k-1]+A[i,k])
其中i<=k<=j,1<=i<=F,A[i,k]为第i束花插在第k个花瓶中的美学值。此时可以从i到j扫描了。我的代码如下:
1: #include <iostream>
2: #include <cstdlib>
3: using namespace std;
4: const int FLOWER_SIZE = 100;
5: const int VASE_SIZE = 100;
6: const int MIN_INT = -(1<<15);
7: int main()
8: {
9: int flowers=0, vases=0;
10: int aesthetic[FLOWER_SIZE][VASE_SIZE];
11: int maxAes[FLOWER_SIZE][VASE_SIZE];
12:
13: cin >> flowers >> vases;
14: if (flowers<1 || flowers>100 || vases<1 || vases>100 || vases<flowers)
15: return -1;
16: for (int i=0; i<flowers; i++)
17: {
18: for (int j=0; j<vases; j++)
19: cin >> aesthetic[i][j];
20: }
21: int maxTemp = maxAes[0][0] = aesthetic[0][0];
22: for (int j=1; j<vases; j++)
23: {
24: if (maxTemp<aesthetic[0][j])
25: maxTemp = aesthetic[0][j];
26: maxAes[0][j] = maxTemp;
27: }
28: for (int i=1; i<flowers; i++)
29: {
30: for (int j=i; j<vases; j++)
31: {
32: maxTemp = MIN_INT;
33: for (int k=i; k<=j; k++)
34: {
35: int temp = maxAes[i-1][k-1]+aesthetic[i][k];
36: maxTemp = maxTemp<temp ? temp : maxTemp;
37: }
38: maxAes[i][j] = maxTemp;
39: }
40: }
41: cout << maxAes[flowers-1][vases-1] << endl;
42: return 0;
43: }