POJ 1157 LITTLE SHOP OF FLOWERS (DP)

題目大意:有F束花和V个花瓶,把F束花放在V个花瓶里面,一个花瓶放一束,要求是第i束必须放在第j束前面(i<j)。为了美学,花瓶和花对应有个美学值,如下图,把azaleas放在第2号花瓶,美学值为23,很漂亮;而把azaleas放在4号花瓶,美学值为-24,很丑。求一种放法,使得美学值总和最大。

1157 

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: }
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值