zjnu(1181)——石子合并
这道题算是最简单的区间dp了。。非常久之前写的,搞懂原理了就1A。
传送门: problem_id=1181">http://acm.zjnu.edu.cn/CLanguage/showproblem?problem_id=1181
状态方程定义:
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[i][j]);
然后利用三层for就好了。
for(int len=2;len<=n;len++){
for(int s=1;s<=n-len+1;s++){
int e=s+len-1;
f[s][e]=inf;
for(int k=s;k<=e-1;k++){
if(f[s][e]>f[s][k]+f[k+1][e]+sum[s][e])
f[s][e]=f[s][k]+f[k+1][e]+sum[s][e];
}
}
}
最重要的是这个循环,可是事实上也挺简单,首先枚举区间长度,齐次枚举起点s,当然这里每次都要对f[s][e]都初始化为正无穷(视题目情况而定),由于这里每一次的s与e都是不同样的。
然后第三层枚举的是k,k相当于跳板的作用,然后在里面进行dp就好了。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 111
#define inf 99999999
int f[maxn][maxn],sum[maxn][maxn],spone[maxn];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&spone[i]);
for(int i=1;i<=n;i++){
sum[i][i]=spone[i];
for(int j=i+1;j<=n;j++){
sum[i][j]=sum[i][j-1]+spone[j];
}
}
int min1=inf;
for(int len=2;len<=n;len++){
for(int s=1;s<=n-len+1;s++){
int e=s+len-1;
f[s][e]=inf;
for(int k=s;k<=e-1;k++){
if(f[s][e]>f[s][k]+f[k+1][e]+sum[s][e])
f[s][e]=f[s][k]+f[k+1][e]+sum[s][e];
}
}
}
if(min1>f[1][n]) min1=f[1][n];
for(int i=1;i<n;i++){
swap(spone[i],spone[i+1]);
for(int l=1;l<=n;l++){
sum[l][l]=spone[l];
for(int q=l+1;q<=n;q++){
sum[l][q]=sum[l][q-1]+spone[q];
}
}
for(int len=2;len<=n;len++){
for(int s=1;s<=n-len+1;s++){
int e=s+len-1;
f[s][e]=inf;
for(int k=s;k<=e-1;k++){
if(f[s][e]>f[s][k]+f[k+1][e]+sum[s][e])
f[s][e]=f[s][k]+f[k+1][e]+sum[s][e];
}
}
}
if(min1>f[1][n]) min1=f[1][n];
swap(spone[i],spone[i+1]);
}
printf("%d\n",min1);
}
/*
3
2 5 1
*/
zjnu(1181)——石子合并的更多相关文章
- zjnu 1181 石子合并(区间DP)
Description 在操场上沿一直线排列着 n堆石子. 现要将石子有次序地合并成一堆.规定每次仅仅能选相邻的两堆石子合并成新的一堆, 并将新的一堆石子数记为该次合并的得分.同意在第一次合并前对调一 ...
- RQNOJ 490 环形石子合并
题目链接:https://www.rqnoj.cn/problem/490 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一 ...
- codevs1048 石子合并
题目链接:http://codevs.cn/problem/1048/ 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代 ...
- 石子合并[DP-N3]
题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- 51Nod 1021 石子合并 Label:Water DP
N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价. 例如: 1 2 3 4,有 ...
- BZOJ 3229: [Sdoi2008]石子合并
3229: [Sdoi2008]石子合并 时间限制: 3 Sec 内存限制: 128 MB提交: 497 解决: 240[提交][][] 题目描述 在一个操场上摆放着一排N堆石子.现要将石子有次序 ...
- nyoj 737 石子合并(一)。区间dp
http://acm.nyist.net/JudgeOnline/problem.php?pid=737 数据很小,适合区间dp的入门 对于第[i, j]堆,无论你怎么合并,无论你先选哪两堆结合,当你 ...
- BZOJ-3229 石子合并 GarsiaWachs算法
经典DP?稳T 3229: [Sdoi2008]石子合并 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 426 Solved: 202 [Submit] ...
- BZOJ3229 石子合并
Description 在一个操场上摆放着一排N堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将N堆石 ...
随机推荐
- js滚动事件实现滚动触底加载
移动端触底加载时前端开发过程中常用功能,主要是通过三个值的大小来进行判断: 首先介绍jquery的写法,代码如下: $(window).scroll(function(){ var windowH=$ ...
- NYIST 1070 诡异的电梯【Ⅰ】
诡异的电梯[Ⅰ]时间限制:1000 ms | 内存限制:65535 KB难度:3 描述新的宿舍楼有 N(1≤N≤100000) 层 and M(1≤M≤100000)个学生. 在新的宿舍楼里, 为了节 ...
- Bridge桥接模式(设计模式11)
在没有使用桥接模式: 扩展新问题(类归属膨胀问题) 1增加性的电脑类型,要增加每个品牌下面的类 2如果要增加一个新的电脑品牌,要增加美中电脑类型的类 违背单一职责原则: · 一个类:联想笔记本,有两个 ...
- git batch
git batch 不用每次自己写了:不是特别推荐哦: git add . git commit -m "commit" git push git status
- 从100PV到1亿级PV站点架构演变
假设你对项目管理.系统架构有兴趣,请加微信订阅号"softjg".增加这个PM.架构师的大家庭 一个站点就像一个人,存在一个从小到大的过程. 养一个站点和养一个人一样.不同一时候期 ...
- poj3101--Astronomy(分数的最小公倍数)
题目链接:id=3101">点击打开链接 题目大意:有n个行星,给出每个行星的旋转的周期.问最少多少时间后n个行星会在一条直线上,初始点在一起,不存在全部的行星都有同一个周期 如果A行 ...
- bzoj4568: [Scoi2016]幸运数字(LCA+线性基)
4568: [Scoi2016]幸运数字 题目:传送门 题解: 好题!!! 之前就看过,当时说是要用线性基...就没学 填坑填坑: %%%线性基 && 神犇 主要还是对于线性基的运用和 ...
- iOS-UITextField 全面解析
iOS中UITextField 使用全面解析 建议收藏,用到的时候来这里一查就都明白了 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField ...
- ThinkPHP5.0框架开发实现简单的页面跳转
ThinkPHP5.0框架开发实现简单的页面跳转 一.效果 登录界面 登录成功界面 登录失败界面 二.目录结构 三.代码 控制器中的Login.php <?php // 声明命名空间 names ...
- Glide中的回调:targets
Glide隐藏了一大推复杂的在后台的场景,Glide做了所有的网络请求和处理在后台线程中,准备好了切回到ui线程后更新ImageView. 假设ImageView不再是图像的最后一步.我们只要Bitm ...