当前位置:网站首页>石子合并板子【区间DP】(普通石子合并 & 环形石子合并)
石子合并板子【区间DP】(普通石子合并 & 环形石子合并)
2022-07-02 10:14:00 【Joanh_Lan】
[SDOI2008] 石子合并
普通石子合并
题目描述
在一个操场上摆放着一排 N N N 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的 2 2 2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。
试设计一个算法,计算出将 N N N 堆石子合并成一堆的最小得分。
输入格式
第一行一个整数 N N N。
接下来 N N N 行,第 i i i 行一个整数 a i a_i ai,代表第 i i i 堆石子的石子数。
输出格式
输出将所有石子合并为一堆的最小得分。
板子
#include <bits/stdc++.h>
#define buff \ ios::sync_with_stdio(false); \ cin.tie(0);
//#define int long long
using namespace std;
const int N = 500;
int n;
int s[N];
int dpm[N][N], dpn[N][N];
void solve()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> s[i],
s[i] += s[i - 1];
for (int len = 2; len <= n; len++)
{
for (int i = 1; i + len - 1 <= n; i++)
{
int l = i, r = i + len - 1;
dpm[l][r] = -1;
dpn[l][r] = 0x3f3f3f3f;
for (int k = l; k < r; k++)
{
dpm[l][r] = max(dpm[l][r], dpm[l][k] + dpm[k + 1][r] + s[r] - s[l - 1]);
dpn[l][r] = min(dpn[l][r], dpn[l][k] + dpn[k + 1][r] + s[r] - s[l - 1]);
}
}
}
cout << dpn[1][n] << '\n'
<< dpm[1][n] << '\n';
}
int main()
{
solve();
}
环形石子合并
[NOI1995] 石子合并
题目描述
在一个圆形操场的四周摆放 N N N 堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。
试设计出一个算法,计算出将 N N N 堆石子合并成 1 1 1 堆的最小得分和最大得分。
输入格式
数据的第 1 1 1 行是正整数 N N N,表示有 N N N 堆石子。
第 2 2 2 行有 N N N 个整数,第 i i i 个整数 a i a_i ai 表示第 i i i 堆石子的个数。
输出格式
输出共 2 2 2 行,第 1 1 1 行为最小得分,第 2 2 2 行为最大得分。
板子
#include <bits/stdc++.h>
#define buff \ ios::sync_with_stdio(false); \ cin.tie(0);
//#define int long long
using namespace std;
const int N = 500;
int n;
int s[N];
int dpm[N][N], dpn[N][N];
void solve()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> s[i],
s[i + n] = s[i];
for (int i = 1; i <= (n << 1); i++)
s[i] += s[i - 1];
for (int len = 2; len <= n; len++)
{
for (int i = 1; i + len - 1 <= (n << 1); i++)
{
int l = i, r = i + len - 1;
dpm[l][r] = -1;
dpn[l][r] = 0x3f3f3f3f;
for (int k = l; k < r; k++)
{
dpm[l][r] = max(dpm[l][r], dpm[l][k] + dpm[k + 1][r] + s[r] - s[l - 1]);
dpn[l][r] = min(dpn[l][r], dpn[l][k] + dpn[k + 1][r] + s[r] - s[l - 1]);
}
}
}
int mx = 0, mn = 0x3f3f3f3f;
for (int i = 1; i + n - 1 <= (n << 1); i++)
{
mx = max(mx, dpm[i][i + n - 1]);
mn = min(mn, dpn[i][i + n - 1]);
}
cout << mn << '\n'
<< mx << '\n';
}
int main()
{
solve();
}
边栏推荐
- Answer: can the audio be set to on by default during easydss video on demand?
- 量子三体问题: Landau Fall
- Bridge of undirected graph
- Solution: Compression Technology (original version and sequel version)
- Achievements in science and Technology (27)
- Detailed collection of common MySQL commands
- 屠榜多目标跟踪!BoT-SORT:稳健的关联多行人跟踪
- D为何链接不了dll
- Unity SKFramework框架(二十一)、Texture Filter 贴图资源筛选工具
- 每日一题:1175.质数排列
猜你喜欢

Unity SKFramework框架(十二)、Score 计分模块

Unity SKFramework框架(二十一)、Texture Filter 贴图资源筛选工具

Japan bet on national luck: Web3.0, anyway, is not the first time to fail!

Unity SKFramework框架(十三)、Question 问题模块

Engineers who can't read device manuals are not good cooks

Gee learning notes 2

EasyDSS点播服务分享时间出错如何修改?

Unity SKFramework框架(十四)、Extension 扩展函数

Unity skframework framework (XVII), freecameracontroller God view / free view camera control script

Unity SKFramework框架(十五)、Singleton 单例
随机推荐
Android kotlin material design technology points
I did it with two lines of code. As a result, my sister had a more ingenious way
Tupang multi-target tracking! BOT sort: robust correlated multi pedestrian tracking
Pocket Raider comments
JS generates 4-digit verification code
【OpenGL】笔记二十九、高级光照(镜面高光)
MAC (MacOS Monterey 12.2 M1) personal use PHP development
SAP MM 因物料有负库存导致MMPV开账期失败问题之对策
The second anniversary of the three winged bird: the wings are getting richer and the take-off is just around the corner
Halcon extract orange (Orange)
[unity] using GB2312, the solution to abnormal program after packaging
[Blue Bridge Cup] children's worship circle
Unity skframework framework (XIII), question module
口袋奇兵点评
Essential for operation and maintenance - Elk log analysis system
leetcode621. 任务调度器
Fundamentals of face recognition (facenet)
[技术发展-22]:网络与通信技术的应用与发展快速概览-2- 通信技术
最近公共祖先LCA的三种求法
Android kotlin fragment technology point