codevs——2102 石子归并 2(区间DP)
在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。
试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.
数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.
输出共2行,第1行为最小得分,第2行为最大得分.
4
4 4 5 9
43
54
经典的区间动态规划。
分类标签 Tags 点此展开
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
],f[][],g[][],maxn,minn=;
int main()
{
scanf("%d",&n);
;i<=n;i++)
{
scanf("%d",&a[i]);
a[n+i]=a[i];
}
;i<=*n;i++)
a[i]+=a[i-];
memset(f,,sizeof(f));
memset(g,,sizeof(g));
;i<=*n;i++)
f[i][i]=g[i][i]=;
*n;i>=;i--)
;j<=*n;j++)
for(int k=i;k<j;k++)
{
f[i][j]=min(f[i][j],f[i][k]+f[k+][j]+a[j]-a[i-]);
g[i][j]=max(g[i][j],g[i][k]+g[k+][j]+a[j]-a[i-]);
}
;i<=n;i++)
{
minn=min(minn,f[i][i+n-]);
maxn=max(maxn,g[i][i+n-]);
}
printf("%d\n%d",minn,maxn);
;
}
注意:
拿到这个题以后我激动了半天,本以为和石子合并一样,让后我就哗哗哗打上了代码,交了两次,结果全wa。
后来才发现,原来这是个环状的!!!
所以,我们就根据上一个题:能量项链来做这个题。
首先我们先化环为链,开一个两倍数组,然后把相邻的累加;
其余的做法就和石子合并一样了!
枚举长度的
#include <algorithm>
#include <cstdio>
#define N 1015
using namespace std;
bool if_;
char ch;
int n,num[N];
int maxn,minn=1e7;
int f_max[N][N],f_min[N][N];
void read(int &x)
{
if_=;x=;
ch=getchar();
')
{
;
ch=getchar();
}
')
{
x=x*+ch-';
ch=getchar();
}
;
}
int main()
{
read(n);
;i<=n;i++)
read(num[i]),num[i+n]=num[i],num[i]+=num[i-];
;i<=n*;i++)
num[i]+=num[i-];
;i<=n;i++)
f_min[i][i]=f_max[i][i]=;
;len<=n;len++)
*n-len;i>=;i--)
{
;
f_min[i][j]=1e7;
f_max[i][j]=;
for(int k=i;k<j;k++)
{
f_min[i][j]=min(f_min[i][j],f_min[i][k]+f_min[k+][j]+num[j]-num[i-]);
f_max[i][j]=max(f_max[i][j],f_max[i][k]+f_max[k+][j]+num[j]-num[i-]);
}
}
;i<=n;i++)
{
minn=min(minn,f_min[i][i+n-]);
maxn=max(maxn,f_max[i][i+n-]);
}
printf("%d\n%d",minn,maxn);
;
}
codevs——2102 石子归并 2(区间DP)的更多相关文章
- codevs——1048 石子归并 (区间DP)
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并 ...
- codevs 2102 石子归并2
传送门 2102 石子归并 2 时间限制: 10 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个园形操场的四周摆放N堆石子,现要将 ...
- 51nod 1021 石子归并 【区间DP】
1021 石子归并 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子 ...
- 石子归并(区间dp 模板)
区间dp入门 #include<iostream> #include<cstdio> #include <cctype> #include<algorithm ...
- CODEVS 2102 石子归并 2
[题目描述 Descriptin] 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分.试设计出1个算法, ...
- 2102 石子归并 2codevs
2102 石子归并 2codevs 题目描述 Description 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为 ...
- Codevs 3002 石子归并 3(DP四边形不等式优化)
3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...
- Codevs 1048 石子归并
1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合 ...
- codevs 1048石子归并
传送门 1048 石子归并 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], ...
随机推荐
- linux命令行操作基本知识
乱七八糟的命令 . 表示当前目录 .. 表示上一级目录 ls 显示文件 -l 列表 -a 隐藏文件 -h 文件大小人性化显示 gedit 自带文本编辑器 subl 打开sublime > 重定向 ...
- redis配置密码 redis常用命令
redis配置密码 1.通过配置文件进行配置yum方式安装的redis配置文件通常在/etc/redis.conf中,打开配置文件找到 [plain] view plain copy #requi ...
- Kinect安装
在连接kinect机器前,需要先安装两个软件,而在安装这两个软件前需要有vs2010(专业版本和快速版),因为需要包含.net framework 4.0 kinect sdk http://www. ...
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 19: ordinal not in range(128)
解决方案: 1: 在网上找到的解决方案是: 在调用import matplotlib.pyplot as plt前 import sys sys.setdefaultencoding(“gbk”) 让 ...
- mysql插入、修改、删除
联合查询: union:合并.联合,将多次查询结果合并成一个结果 语法: 查询语句1: union[all] 查询语句2: union [all] ... 意义 1.将一条比较复杂的查询语句可拆分成多 ...
- Set-DnsServerGlobalQueryBlockList
Set-DnsServerGlobalQueryBlockList Windows Server Technical Preview and Windows 10 Other Versions ...
- 图文详解安装PHP运行环境
一.什么是PHP运行环境 能够理解人与计算机交流时语言软件,通常指解释PHP编程语言的软件. 例如: PHP(代码) 需要PHP超文本预编译器(软件). Java需要JVM虚拟机 二.安装PHP运行环 ...
- Careercup - Microsoft面试题 - 5485521224597504
2014-05-12 06:19 题目链接 原题: Given an input list of lists.. flatten the list. For e.g. {{,}, {}, {,}} . ...
- python小脚本(18-11.10)-修改excle后批量生成,作用:导入数据时,系统做了不能导入重复数据时的限制时使用 -本来是小白,大神勿扰
from testcase.test_mokuai.operation_excle import OperationExcleimport shutil class test_daoru(): #一个 ...
- sqlserver 获取一个月有多少天
--思路:给定日期的下一个月的1号减去1天,然后取datepart(DAY,dt) declare @dt varchar(10)select @dt='2013-11-20'select datep ...