<四边形不等式优化>[NOI1995]石子合并
2024-10-21 15:48:09
留个坑
挺套路的
明天来写个总结
#include<cstdio>
#include<algorithm>
inline int read() {
int x = 0,f = 1;
char c = getchar();
while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar();
return x * f;
}
const int maxn = 2007;
int dp[maxn][maxn],s[maxn][maxn],cnt[maxn];
int sum[maxn];
int dpm[maxn][maxn];
int main () {
int n = read();
for(int i = 1;i <= n;++ i) cnt[n + i] = cnt[i] = read(),sum[i] = sum[i - 1] + cnt[i];
for(int i = n + 1;i <= n * 2;++ i) sum[i] = sum[i - 1] + cnt[i];
for(int i = 1;i <= 2 * n;++ i) s[i][i] = i;
for(int i = n * 2 - 1;i >= 1;-- i) {
for(int j = i + 1;j <= n * 2;++ j) {
int tmp = 0x7fffffff,loc = 0;
dpm[i][j] = std::max(dpm[i][j - 1],dpm[i + 1][j]) + sum[j] - sum[i - 1];
for(int k = s[i][j - 1];k <= s[i + 1][j];++ k) {
if(tmp >dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1]) {
tmp = dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1];
loc = k;
}
}
dp[i][j] = tmp;
s[i][j] = loc;
}
}
int ansm = 0x7fffffff,ansx = 0;
for(int i = 1;i <= n;++ i) {
ansm = std::min(dp[i][i + n - 1],ansm) ;
ansx = std::max(dpm[i][i + n - 1],ansx) ;
}
printf("%d\n%d",ansm,ansx);
return 0;
}
最新文章
- Shell_1 简介
- QTableWidget详解(样式、右键菜单、表头塌陷、多选等)
- 蛋疼的vs
- T4模板之初体验(语法)
- C++ streambuf用法
- ASP.NET的错误处理机制之二(实例log4net)
- YII 配置文件
- [GCJ]Password Attacker
- discuz云平台报调用远程接口失败的问题分析和解决
- Laravel框架——Session操作
- HDU5032 -- Always Cook Mushroom 树状数组 14年北京网络赛
- NSIS:禁止选择安装路径和编辑安装目录
- carry-检查数据接口返回数据合法性
- 【SQL注入】mysql中information_schema详解
- PHP中让json_encode不自动转义斜杠“/”的方法
- 删除一个cjson导致系统死机
- Golang优秀开源项目汇总
- wc.java
- vue、react、angular三大框架对比 &;&; 与jQuery的对比
- Oracle数据库 中的基础的一些语法结构