石子合并(一)

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
 
描述
    有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。
 
输入
有多组测试数据,输入到文件结束。
每组测试数据第一行有一个整数n,表示有n堆石子。
接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开
输出
输出总代价的最小值,占单独的一行
样例输入
3
1 2 3
7
13 7 8 16 21 4 18
样例输出
9
239 区间dp,无论有多少堆石子,最后总要是分成了两堆,然后合成这两堆,我们要求出最小消耗值。
dp[start][end]表示取走start到end位置的石子的最小消耗值,
我们假设子问题答案已经求出,则有:dp[i][j]=MIN{dp[i][k]+dp[k+1][j]+SUM(i,j)|i<=k<j}
不难发现要想求出长度为len的区间的最小值,我们需要长度为(1---len-1)之间的最小值作为支撑递推继续下去的源泉,
所有想到,从长度为1开始递推直至推到长度为n也就是answer!
显然是一个O(N^3)复杂度的DP,有四边形优化为O(N^2),目前不会,以后补。

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int a[205],dp[205][205];
int sum[205][205];
int SUM(int s,int e)
{
if(sum[s][e]!=-1) return sum[s][e];
int sumn=0,i;
for(i=s;i<=e;++i) sumn+=a[i];
return sum[s][e]=sumn;
}
int main()
{
int n,m,i,j,k;
while(cin>>n){memset(dp,inf,sizeof(dp));memset(sum,-1,sizeof(sum));
for(i=1;i<=n;++i) scanf("%d",&a[i]),dp[i][i]=0;
for(k=2;k<=n;++k)                              //控制区间长度
for(i=1;i+k-1<=n;++i){                          //i表示起点,由于长度的限制i不可取任意值
int minn=inf;
for(j=i;j<=i+k-1;++j) if(dp[i][j]+dp[j+1][i+k-1]<minn) minn=dp[i][j]+dp[j+1][i+k-1];     //j表示从此点分开,minn表示后合并左右两堆最小的值
dp[i][i+k-1]=minn+SUM(i,i+k-1);
}
cout<<dp[1][n]<<endl;
}
return 0;
}

nyoj737区间dp(石子合并)的更多相关文章

  1. 区间DP石子合并问题 & 四边形不等式优化

    入门区间DP,第一个问题就是线性的规模小的石子合并问题 dp数组的含义是第i堆到第j堆进行合并的最优值 就是说dp[i][j]可以由dp[i][k]和dp[k+1][j]转移过来 状态转移方程 dp[ ...

  2. 石头合并 NYOJ737 区间dp

    题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737 石子合并(一) 时间限制:1000 ms  |  内存限制:65535 KB ...

  3. DP石子合并问题

    转自:http://www.hnyzsz.net/Article/ShowArticle.asp?ArticleID=735 [石子合并]    在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序 ...

  4. 四边形不等式优化DP——石子合并问题 学习笔记

    好方啊马上就要区域赛了连DP都不会QAQ 毛子青<动态规划算法的优化技巧>论文里面提到了一类问题:石子合并. n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的 ...

  5. 「区间DP」「洛谷PP3146 」[USACO16OPEN]248 G

    [USACO16OPEN]248 G 题目: 题目描述 Bessie likes downloading games to play on her cell phone, even though sh ...

  6. nyoj737 石子合并(一) 区间DP

    dp[x][y]表示合并[x, y]区间的石子的最小花费,将区间长度递增枚举即可. AC代码: #include<cstdio> #include<algorithm> usi ...

  7. nyoj 737 石子合并(一)。区间dp

    http://acm.nyist.net/JudgeOnline/problem.php?pid=737 数据很小,适合区间dp的入门 对于第[i, j]堆,无论你怎么合并,无论你先选哪两堆结合,当你 ...

  8. [NYIST737]石子合并(一)(区间dp)

    题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737 很经典的区间dp,发现没有写过题解.最近被hihocoder上几道比赛题难住了 ...

  9. CSU 1592 石子合并 (经典题)【区间DP】

    <题目链接> 题目大意: 现在有n堆石子,第i堆有ai个石子.现在要把这些石子合并成一堆,每次只能合并相邻两个,每次合并的代价是两堆石子的总石子数.求合并所有石子的最小代价. Input ...

随机推荐

  1. SVN版本服务器搭建

    windows:        https://blog.csdn.net/lu1024188315/article/details/74082227 SVN 的下载地址如下 http://torto ...

  2. 【翻唱】【你的名字MAD】爱你等于爱自己

    http://video.yingtu.co/0/8f606e9b-9694-4d35-a0bf-730391a3ee12.mp4 [你的名字MAD]爱你等于爱自己-原唱翻唱 http://video ...

  3. TED #09# You don't have to be an expert to solve big problems

    Tapiwa Chiwewe: You don't have to be an expert to solve big problems Collection noticed a haze hangi ...

  4. Android 深入理解Activity 页面Intent跳转

  5. C++设计模式 之 “对象性能” 模式:Singleton、Flyweight

    “对象性能”模式 面向对象很好地解决了“抽象”的问题,但是必不可免地要付出一定的代价.对于通常情况来讲,面向对象的成本大都可以忽略不计.但是某些情况,面向对象所带来的成本必须谨慎处理. 典型模式 # ...

  6. zabbix监控之自定义item

    zabbix安装完成后,当需要使用自定义脚本构建自定义item必须注意以下几点: 1.首先使用zabbix_get手动在zabbix-server服务端获取监控的默认的item值,如下: [root@ ...

  7. 20145106 《Java程序设计》第9周学习总结

    教材学习内容总结 JDBC标准主要分为两个部分:JDBC应用程序开发者接口以及JDBC驱动程序开发者接口. 如果将来要换为Oracle数据库,只要置换Oracle驱动程序. Java中的数据类型和SQ ...

  8. FSMC(STM32)

    (一)FSMC:Flexible Static Memory Controller,可变(灵活)静态存储控制器 小容量产品是指闪存存储器容量在1 6K至32K 字节之间的STM32F101xx.STM ...

  9. 在terminal下的快捷键

    1.回到行首的快捷键:ctrl + esc 2.ctrl+[可以替代esc

  10. spring boot打war包发布

    由于公司一贯的方式都是将war包布在中间件tomcat下运行 所以这次springboot项目需要打war包 how to? 第一步:pom.xml 文件中,打包方式需要修改成war <pack ...