石子归并_codevs1048_dp
2016-07-05 17:24
399 查看
题目描述 Description
有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1]。问安排怎样的合并顺序,能够使得总合并代价达到最小。输入描述 Input Description
第一行一个整数n(n<=100)第二行n个整数w1,w2…wn (wi <= 100)
输出描述 Output Description
一个整数表示最小合并代价样例输入 Sample Input
44 1 1 4
样例输出 Sample Output
18思路:
比较好奇为什么这么多重名题目,搜到好多关于石子、归并区间dp,f[i][j]b表示合并i至j项的最小代价。转移方程如下:
f[i][j]=min{f[i][k]+f[k+1][j]+cost[i][j]}
刷水题的过程中学习了三目运算符,装逼利器高效算法get√
代码/c++:
#include <stdio.h> int f[101][101]={0}; int cost[101]={0}; int a[101]={0}; int min(int x,int y) { return x<y?x:y; } int main() { int n; scanf("%d",&n); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) f[i][j]=1<<31-1; for (int i=1;i<=n;i++) { scanf("%d",&a[i]); cost[i]=cost[i-1]+a[i]; f[i][i]=0; } for (int i=n-1;i>=1;i--) for (int j=i+1;j<=n;j++) for (int k=i;k<=j-1;k++) f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+cost[j]-cost[i-1]); printf("%d\n",f[1] ); return 0; }
相关文章推荐
- VS2012下安装OpenCV3.0.0的记要
- OpenGL的gluLookAt和glOrtho的关系
- 《解决微信内置浏览器返回上一页强制刷新问题方法》
- [IOS]JSPatch
- Mantis查看问题列表的列名修改_"P","#"两列
- Parcelable encountered IOException writing serializable object (name = xxx)
- HDOJ 3555 Bomb
- factor graph,potential function,Template models
- 调用kettle api传参时不赋值的解决方法
- StringBuffer、StringBuilder、ArrayList、Vector、HashMap、HashTable是如何扩容的
- SVN提交碰到的问题奇怪的问题
- visual studio code for mac 的对齐快捷键
- Java 注解
- 操练
- java spring mvc restful 上传文件
- Leetcode练习笔记——169. Majority Element
- js自定义事件及事件交互原理概述(二)
- Oracle处理CLOB超过4000入库问题 (2)
- nginx.conf配置
- .net core相关博客