码迷,mamicode.com
首页 > 其他好文 > 详细

蒟蒻吃药计划-治疗系列 #round 2 合并石子+乘积最大

时间:2018-02-04 16:44:12      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:gif   hellip   event   小朋友   blog   line   turn   二维数组   onclick   


1.合并石子

《信息学奥赛一本通》第五版 P371 第三节 T1

我就直接开始讲吧:

Warning:这个题目和 合并果子 不一样!不一样!不一样!不一样!不一样!不一样!不一样!不一样!

技术分享图片:我想告诉你一个事情,你帮帮我好么?

(内心:mmp怎么又是这个人)

技术分享图片:昨天我去商场的时候,钱包被偷了,银行卡啥的都没了,你能帮帮我么?

(内心:凭啥,我就不帮)

技术分享图片:如果你帮我找到的话,我给你50金币好不好?

(*听到这句话,你充满了决心)

好吧,那我们帮帮他吧,让我们先看看他遇到了什么问题

技术分享图片:那个小偷在我的钱包里留了一张纸条,上面写着一个地址,我昨天到那里去之后看到那儿有几堆石头,上面都有数字,旁边有一块石碑,要我把相邻的两对合并,最后只剩一堆,让花费的体力最小

体力是怎么计算的呢?

技术分享图片:两堆石子合并之后,花费的体力值为两堆石头上的数字的和

好,那我们先和他告别,自己想一想

他已经告诉我们,有 N 堆石子,每堆石子都有对应的一个数字

我们就开一个 stone 数组表示吧

不过要说明一点,为了表示方便,我们把 stone[i] 表示为前 i 堆石子的和

我们再开一个 giver 二维数组,并且让 giver[i][j] 表示为第 i 堆到第 j 堆的石子合并之后花费的最小体力值

那么,我们应该怎么去求得花费最小的体力值呢?

让我们仔细思索一下

先开个循环吧

设有一 i 并使得 i=n-1...1 作为左端点

再设一 j 使得 j=i+1...n 作为右端点

可是这样好像还不够

那我们再弄一个 k 并让 k=i...j-1 把 i 开头 j 结尾的 giver[i][j] 分成两段

k 枚举每一种可能的分段,一步一步推出正确答案!

根据上面的东西,我们就可以推出状态转移方程:

giver[i][j]=min(giver[i][j],giver[i][k]+giver[k+1][j]+stone[j]-stone[i-1]);

对啦!

边界条件:

giver[1...n][1...n]=0;

现在,让我们带着这两个小朋友开始破译这个问题吧!

代码如下:

技术分享图片
 1 #include <bits/stdc++.h>
 2 #define fp(i,l,r) for(register int i=(l);i<=(r);++i)
 3 #define fd(i,l,r) for(register int i=(l);i>=(r);--i)
 4 using namespace std;
 5 inline int botposs(int a,int b,int pd){
 6     if(pd==1) return a>b?a:b;
 7     if(pd==0) return a>b?b:a;
 8 }
 9 int main(){
10     int n;
11     int stone[100+20]={0};
12     int giver[100+20][100+20];
13     memset(giver,32,sizeof(giver));
14     stone[0]=0;
15     scanf("%d",&n);
16     fp(i,1,n){
17         int x;
18         scanf("%d",&x);
19         stone[i]=stone[i-1]+x;
20     }
21     fp(i,1,n){
22         giver[i][i]=0;
23     }
24     fd(i,n-1,1){
25         fp(j,i+1,n){
26             fp(k,i,j-1){
27                 giver[i][j]=botposs(giver[i][j],giver[i][k]+giver[k+1][j]+stone[j]-stone[i-1],0);
28             }
29         }
30     }
31     printf("%d",giver[1][n]);
32     return 0;
33 }
合并石子

现在我们去找他吧!

他成功了吗?

技术分享图片:成是成功了,钱包也找回来了,可是解开这个谜题之后,突然出现了一个山洞,里面有一个房间,乌七八黑的,我不敢进去,你再帮帮我好吗?如果成功,我给你100金币

(*你充满了决心)

好吧,我们就再答应他一次吧!


未完待续……

 

蒟蒻吃药计划-治疗系列 #round 2 合并石子+乘积最大

标签:gif   hellip   event   小朋友   blog   line   turn   二维数组   onclick   

原文地址:https://www.cnblogs.com/Fraction/p/8413340.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!