Pku acm 1157 LITTLE SHOP OF FLOWERS 动态规划题目解题报告(十四)

http://acm.pku.edu.cn/JudgeOnline/problem?id=1157

该题也是经典的动态规划,题目叙述的依然很麻烦,其实简化一下就是这样的:例如下面这个例子就是:3表示行,5表示列,然后在下面的35列每一行选一个数,使这3个数最大,要求选的数列数必须依次增大,就是从左上方想右下方选3个数使和最大。

3 5

7 23 -5 -24 16

5 21 -4 10 23

-21 5 -4 -20 20              

我们用opt定义以当前I j为结尾的花的排序的最大值,用r*(-50)表示负无穷,初始化时第一行为origin[i][j],后面为r*(-50)

Opt[][]

1

2

3

4

5

1

7

23

-5

-24

16

2

-150

-150

-150

-150

-150

3

-150

-150

-150

-150

-150

从第二行开始,对于第i行第j列,对于i>=j,遍历i-1行前j,求出当前最大值。

Opt[][]

1

2

3

4

5

1

7

23

-5

-24

16

2

-150

21+7

-4+max(7,23,-5)

10+max(7,23,-5,-24)

23+max(…)

3

-150

-150

-150

-150

-150

I=3:

Opt[][]

1

2

3

4

5

1

7

23

-5

-24

16

2

-150

28

19

33

46

3

-150

-150

-4+max(-150,28)

-20+max()

20+max(-150,28,19,33)

最后取第i行最大值即可,核心的c代码:

for(i=2;i<=r;i++)

         for(j=1;j<=c;j++)

                          if(j>=i)

                           for(k=1;k<j;k++)

                                if(opt[i][j]<opt[i-1][k]+origin[i][j])

                                    opt[i][j]=opt[i-1][k]+origin[i][j];

 

带有详细注释的代码可以在http://download.csdn.net/user/china8848/获得

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值