区间DP初探 P1880 [NOI1995]石子合并
区间$dp$,顾名思义,是以区间为阶段的一种线性$dp$的拓展
状态常定义为$f[i][j]$,表示区间$[i,j]$的某种解;
通常先枚举区间长度,再枚举左端点,最后枚举断点$(k)$
石子合并便是一道经典的区间$dp$
#include <bits/stdc++.h>
#define read read()
#define up(i,l,r) for(int i = (l);i <= (r); i++)
#define inf 0x3f3f3f3f
using namespace std;
int read
{
int x = ;char ch = getchar();
while(ch < || ch > ) ch = getchar();
while(ch>= && ch <= ) {x = * x + ch - ; ch = getchar();}
return x;
}
const int N = ;
int n,cnt[N],sum[N],f1[N][N],f2[N][N];
int main()
{
freopen("stone.in","r",stdin);
n = read;
//memset(f2,0x3f,sizeof(f2));
up(i,,n) cnt[i] = cnt[i + n] = read;//,f1[i][i] = 0,f2[i][i] = 0; ->
up(i,,((n<<)-)) sum[i] = sum[i - ] + cnt[i];//前缀和 ->[1,2n-1] 处理环;
up(L,,n)//[2,n] //枚举区间长度
up(i,,( (n<<) - L + ) ) //枚举左端点
{
int j = i + L - ;//右端点;
f1[i][j] = ; f2[i][j] = inf;//初始化;
up(k,i,(j - ))//枚举断点 [i,j)
{
f1[i][j] = max(f1[i][j],f1[i][k] + f1[k + ][j]);
f2[i][j] = min(f2[i][j],f2[i][k] + f2[k + ][j]);
}
f1[i][j] += (sum[j] - sum[i - ]);
f2[i][j] += (sum[j] - sum[i - ]);//!!加上这次合并[i,j]的分数;
}
int max_ans = ,min_ans = inf;
up(i,,n)//[1,n]
{
int j = i + n - ;
max_ans = max(max_ans,f1[i][j]);
min_ans = min(min_ans,f2[i][j]);
}
printf("%d\n",min_ans);
printf("%d",max_ans);
return ;
}
区间DP初探 P1880 [NOI1995]石子合并的更多相关文章
- 【区间dp】- P1880 [NOI1995] 石子合并
记录一下第一道ac的区间dp 题目:P1880 [NOI1995] 石子合并 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 代码: #include <iostream> ...
- 区间DP小结 及例题分析:P1880 [NOI1995]石子合并,P1063 能量项链
区间类动态规划 一.基本概念 区间类动态规划是线性动态规划的拓展,它在分阶段划分问题时,与阶段中元素出现的顺序和由前一阶段的那些元素合并而来由很大的关系.例如状态f [ i ][ j ],它表示以已合 ...
- P1880 [NOI1995]石子合并[区间dp+四边形不等式优化]
P1880 [NOI1995]石子合并 丢个地址就跑(关于四边形不等式复杂度是n方的证明) 嗯所以这题利用决策的单调性来减少k断点的枚举次数.具体看lyd书.这部分很生疏,但是我还是选择先不管了. # ...
- P1880 [NOI1995]石子合并 区间dp
P1880 [NOI1995]石子合并 #include <bits/stdc++.h> using namespace std; ; const int inf = 0x3f3f3f3f ...
- 洛谷 P1880 [NOI1995]石子合并 题解
P1880 [NOI1995]石子合并 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试 ...
- HDU4632 Poj2955 括号匹配 整数划分 P1880 [NOI1995]石子合并 区间DP总结
题意:给定一个字符串 输出回文子序列的个数 一个字符也算一个回文 很明显的区间dp 就是要往区间小的压缩! #include<bits/stdc++.h> using namesp ...
- 洛谷 P1880 [NOI1995] 石子合并(区间DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 这道题是石子合并问题稍微升级版 这道题和经典石子合并问题的不同在于,经典的石子合 ...
- P1880 [NOI1995]石子合并【区间DP】
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- P1880 [NOI1995]石子合并 区间dp+拆环成链
思路 :一道经典的区间dp 唯一不同的时候 终点和起点相连 所以要拆环成链 只需要把1-n的数组在n+1-2*n复制一遍就行了 #include<bits/stdc++.h> usi ...
随机推荐
- Intent Activity跳转 传递数据 Bundle
1.普通跳转: Intent intent=new Intent(); intent.setClass(MainActivity.this,NewActivity.class); //新建一个Inte ...
- robotium—只有apk文件的测试
把ppt的内容总结一下,并把问题说明一下: 把基本步骤搞出来,用notepad的程序吧,直接安装apk,就当做是不知道源码就好啦! 直接用自己的手机上就行啦!! 一.重签名: 步骤: 1.直接运行re ...
- [Java学习]面向对象-多态
多态 多态发生条件 发生在有继承关系的类型中. 向上转型(自动类型转换)与向下转型(强制类型转换) //向上转型 //编译阶段a1被编译器看作是Animal类型,所以a1引用绑定的是Animal类中的 ...
- iOS指令集
公司在进行项目重构时,其中一个地方的改动就是调整了iOS的指令集.更改指令集主要可以对手机应用的安装机型做出控制,同时在研发过程中也可以控制相关的模拟器和真机.它们原则上是向下兼容的,比如iphone ...
- XML 解析技术
xml 解析方式有两种: dom 解析和 sax 解析: 针对着两种解析方式,有三种解析器: sun公司的 jaxp dom4j 组织的 dom4j jdom 组织的 jdom dom 解析XML : ...
- Head First Servlets & JSP 学习笔记 第五章 —— 作为Web应用
初始化参数:(init-param) 初始化参数写在web.xml文件中:(写在<servlet>标签内部) <servlet> <servlet-name>Bee ...
- vue总结2
1. 给router-link添加事件 之前用v-link 现在用 router-link 添加事件要用原生的.native修饰v-on <my-component v-on:click.nat ...
- kalman滤波(一)---对各参数的理解
一.引言 1.卡尔曼滤波中的真实值,测量值,预测值,估计值怎么区分?他的5条公式是其核心内容,结合现代的计算机,其实卡尔曼的程序相当的简单,只要你理解了他的那5条公式. 用一个简单的小例子:假设我们要 ...
- RSA加密遇到的一个问题
1,最近在项目里面使用了RSA加密解密的功能 出现的异常情况是加解密时对于有中文的情况会出现乱码,导致无法正常解析参数 解决方案人认为:针对中文应该 先encode ,这样能有效的避免乱码
- Django模板如何用一个变量查找字典值
mydict = {"key1":"value1", "key2":"value2"} 在Django模板中查找字典值的 ...