luogu P1880ybtoj 区间DP课堂过关 例题1石子合并 & [NOI1995] 石子合并

Posted SSL_ZZL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P1880ybtoj 区间DP课堂过关 例题1石子合并 & [NOI1995] 石子合并相关的知识,希望对你有一定的参考价值。

【例题1】石子合并 & [NOI1995] 石子合并


Link

【ybtoj】【区间DP课堂过关】【例题1】石子合并
【luogu】【P1880】 [NOI1995] 石子合并
题面//因为不知道侵不侵权所以就是题面是私密的,有账号的直接看转送门就可了


题目大意

几堆石子围成一圈
每次选相邻的两堆合成一堆,费用是这新一堆石子的个数。
把所有石子合成一堆,求最大费用最小费用。


解题思路

以下用求最小费用为例
f [ i ] [ j ] f[i][j] f[i][j]为把 i i i j j j的石子合并需要的费用
i i i j j j中找一个‘切割点’ m m m(middle)(期末后遗症)
f [ i ] [ j ] = m i n ( f [ i ] [ j ] , f [ i ] [ m ] + [ m + 1 ] [ j ] ) f[i][j] = min(f[i][j],f[i][m]+[m+1][j]) f[i][j]=min(f[i][j],f[i][m]+[m+1][j])
再加上 i i i j j j的石子和

三层循环

  1. 合并长度
  2. 左端点(右端点 = 左端点 + 合并长度 - 1)
  3. 转折点

围成一圈的问题
把序列复制一遍,放在原数组后(就是延长一倍)


Code

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int maxn = 0x7fffffff, oue = 300;
int n, a[oue], sum[oue], f_min[oue][oue], f_max[oue][oue], fmin = maxn, fmax;

void init() {
	for(int i = n + 1; i <= n * 2; i++)
		a[i] = a[i - n];
	for(int i = 1; i <= n * 2; i++)  //用前缀求石子数
		sum[i] = sum[i - 1] + a[i];
	memset(f_min, 0x7f, sizeof(f_min));  //初始化
	for(int i = 1; i <= n * 2; i++)
		f_min[i][i] = 0;
}

int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	init();
	for(int len = 2; len <= n; len++)
		for(int l = 1; l + len - 1 <= n * 2; l++) {
 			int r = l + len - 1;
			for(int m = l; m < r; m++) {
				f_min[l][r] = min(f_min[l][r], f_min[l][m] + f_min[m + 1][r]);
				f_max[l][r] = max(f_max[l][r], f_max[l][m] + f_max[m + 1][r]);
			}
			f_min[l][r] += sum[r] - sum[l - 1];
			f_max[l][r] += sum[r] - sum[l - 1];
		}
	for(int l = 1; l <= n; l++) {  //因为是一圈所以有多种合并方法
		fmin = min(fmin, f_min[l][l + n - 1]);
		fmax = max(fmax, f_max[l][l + n - 1]);
	}
	printf("%d\\n%d", fmin, fmax);
} 

以上是关于luogu P1880ybtoj 区间DP课堂过关 例题1石子合并 & [NOI1995] 石子合并的主要内容,如果未能解决你的问题,请参考以下文章

luogu UVA10559 ybtoj 区间DP课堂过关 例题3消除木块 & 方块消除 Blocks

luogu P3372ybtoj线段树课堂过关例题2区间查改 &模板线段树 1

luogu P1352ybtoj 树形DP课堂过关 例题1树上求和 & 没有上司的舞会

luogu P4514ybtoj树状数组课堂过关差分 例题6区间修改区间查询 & 上帝造题的七分钟

luogu P1048ybtoj背包问题课堂过关DP例题1采药问题 &NOIP2005 普及组采药

luogu P5020ybtoj背包问题课堂过关DP例题2货币系统 & NOIP2018 提高组货币系统