【四边形不等式】noi95- 合并石子
2024-08-26 11:03:28
【题目大意】
在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。试设计出1个算法,计算出将N堆石子合并成1堆的最大得分。
【思路】
设 dp[i][j] 表示第 i 到第 j 堆石子合并的最优值,sum[i][j] 表示第 i 到第 j 堆石子的总数量。
#include<iostream>
#include<cstdio>
using namespace std;
const int N=;
const int INF=0x7fffffff;
int n;
int a[N],sum[N],dp[N][N],s[N][N]; void f()
{ for (int i=;i<=n;i++) dp[i][i]=,s[i][i]=i;
for (int r=;r<n;r++)
{
for (int i=;i<n;i++)
{
int j=i+r;
if(j>n) break;
dp[i][j]=INF;
for (int k=s[i][j-];k<=s[i+][j];k++)
{
if(dp[i][j]>dp[i][k]+dp[k+][j])
{
dp[i][j]=dp[i][k]+dp[k+][j];
s[i][j]=k;
}
}
dp[i][j]+=sum[j]-sum[i-];
}
}
} int main()
{
while(~scanf("%d",&n))
{
sum[]=;
for (int i=;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-]+a[i];
}
f();
printf("%d\n",dp[][n]);
}
return ; }
最新文章
- Palo(OLAP database)&ndash;MOLAP
- MVC5-5 Razor引擎及视图结构
- Python的with语句
- Google Kubernetes设计文档之服务篇-转
- libcurl 使用的几个注意事项
- jquery图片3D旋绕效果 rotate3Di的操作
- Python中yield深入理解
- leetcode第40题--First Missing Positive
- ch2-mysql相关
- Django入门(一)
- 通过代码配置 Log4net来实现日志记录
- Linux系统安装软件出错
- centos7配置consul
- VMware虚拟机Linux增加磁盘空间的扩容操作
- Spring mvc项目导出jar包无法识别正常映射问题
- 【刷题】LOJ 6009 「网络流 24 题」软件补丁
- MVC的Ajax异步请求
- python3学习笔记(5)_slice
- php正则表达式的三个最基本原则分享
- 14 MySQL--事务&;函数与流程控制