区间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 ...
随机推荐
- maven 创建project
------------------------------maven3常用命令--------------------------- 1.常用命令 1)创建一个Project mvn archety ...
- DES对称加密
DES是对称性加密里面常见一种,全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法.密钥长度是64位(bit),超过位数密钥被忽略.所谓对称性加密,加密 ...
- JAVA EXAM3 复习提纲
[Practice11_Zipcode_ArrayList] Zipcode class: //3 variables: zipcode, city, county, and compare by c ...
- Linux磁盘挂载详述
1.查看硬盘信息及分区 一般使用”fdisk -l”命令可以列出系统中当前连接的硬盘,设备和分区信息.新硬盘没有分区信息,则只显示硬盘大小信息. [root@localhost home]# fdis ...
- 用java修改文件的编码
1.将本地的文件转换成另外一种编码输出,主要逻辑代码如下: /** * 将本地文件以哪种编码输出 * @param inputfile 输入文件的路径 * @param outfile 输出文件的路径 ...
- Http方式下载文件
代码: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System ...
- Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this
最近使用新版本的mysql,执行语句的时候报错.网上找了一下,解决方法如下: vim /etc/mysql/conf.d/mysql.cnf [mysqld] sql_mode=STRICT_TRAN ...
- 文件操作 day8
一,文件操作基本流程. 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众 ...
- matlab函数拟合
1 函数拟合 函数拟合在工程(如采样校正)和数据分析(如隶属函数确定)中都是非常有用的工具.我这里将函数拟合分为三类:分别是多项式拟合,已知函数类型的拟合和未知函数类型的拟合.matlab中关于函数的 ...
- java有车有房有能力最基本运用
public class yunsuan { public static void main(String[] args) { // 1是有,0是没有 int i = 1, l = 0;// 有房 i ...