nyoj-737石子合并(一)
来源:互联网 发布:武汉大学生知乎 编辑:程序博客网 时间:2024/05/21 16:04
石子合并(一)
石子合并是一道典型的动规问题
动规问题的实质其实就是从小问题到解决大问题
(把大问题分解,一直分解到问题小到直接暴力可以解决)
合并的规则就是,最小的问题是两堆石子合并!
其次是三堆的,然后四堆
可以开一个dp[i][j]数组表示从i到j的最优解(花费最小)
而我们要从两堆石子开始合并,那么就要保证第一次更新最优解的时候i和j相差为1
然后让相差的值依次递增,即再枚举一个L(L表示多少堆石子进行合并)
注意初始化!!
dp[i][j]的初始化要十分小心,是如果把全部的都初始化了,那么就是个WA!
如果初始化的少了也是个WA!!
dp的初始化是为了状态转移方程中用
下面上代码:
#include<stdio.h>#include<algorithm>#include<iostream>#include<string.h>using namespace std;const int inf=0x3f3f3f3f;const int maxn=205;int sum[maxn],dp[maxn][maxn];int main(){ int n; while(~scanf("%d",&n)) { memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) dp[i][j]=inf; for(int i=1; i<=n; i++) { scanf("%d",&sum[i]); sum[i]+=sum[i-1]; } for(int l=1; l<=n-1; l++) { for(int i=1; i<=n-l; i++) { int j=i+l; for(int k=i;k<j;k++) { dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]); } } } printf("%d\n",dp[1][n]); }}
阅读全文
1 0
- Nyoj 737 石子合并(一)
- NYOJ 737 石子合并(一)
- NYOJ 737石子合并(一)
- nyoj 737 合并石子一(dp)
- NYOJ 737 石子合并(一)
- nyoj-737石子合并(一)
- NYOJ 737 石子合并(一)
- NYOJ 737 合并石子(一)
- NYOJ 737 石子合并(一)(环形)
- NYOJ题目737石子合并(一)(区间dp)
- NYOJ 737 石子合并(一)(区间动规)
- nyoj 石子合并(一) 737 (DP)
- nyoj-737--石子合并(一)(动态规划)
- NYOJ 737 石子合并(一)(区间dp)
- nyoj 737 石子合并(一)(区间dp)
- nyoj 737 石子合并(一)(区间DP)
- NYOJ 737 — 石子合并(一) 区间dp
- nyoj 737 石子合并(一) 【区间dp】
- 剑指offer:重建二叉树
- 选择排序
- maven安装
- 嵌入式开发学习步骤
- 欢迎使用CSDN-markdown编辑器
- nyoj-737石子合并(一)
- USACO月赛2017.02 铂金组T3--FRIENDCROSS【CDQ分治】
- 【一头扎进JMS】(4)----RabbitMQ概述
- PAT乙级 1016. 部分A+B (15)
- CentOS7 修改主机名
- 摄像头视频存储
- windows安装cordova流程实践
- jQuery的ready()事件与js中的onload事件的区别
- HDU 1074 Doing Homework【状压DP】