Nyoj 737: 石子合并(一)(区间DP+四边形优化)

石子合并(一)

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述
    有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。
输入
有多组测试数据,输入到文件结束。
每组测试数据第一行有一个整数n,表示有n堆石子。
接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开
输出
输出总代价的最小值,占单独的一行
样例输入
3
1 2 3
7
13 7 8 16 21 4 18
样例输出
9
239


参考四边形优化:

http://blog.csdn.net/jaihk662/article/details/78174717

dp[i][j] = dp[i][k]+dp[k+1][j]+w[i, j]

假设现在i是固定不变的

那么方程就变成了dp[j] = dp[k]+w[k, j]符合1D/1D动态规划经典模型

可以证得它也满足四边形不等式:w(i, j)+w(i', j') <= w(i', j)+w(i, j')  (i<=i'<=j'<=j)


这样的话dp[i][j]的最优决策点k和dp[i][k-1]的最优决策点k'一定满足k>=k'

同理dp[i][j]的最优决策点k和dp[i+1][k]的最优决策点k''一定满足k<=k''

令c[i][j]为dp[i][j]的最优决策点

那么求dp[i][j]只用从c[i+1][j]枚举到c[i][j-1]即可,复杂度O(n²)


引理:

对于dp方程:dp[i][j] = dp[i][k]+dp[k+1][j]+w[i, j],假设w[i, j]满足四边形不等式

那么dp[i][j]也满足四边形不等式dp[i][j]+dp[i'][j']<=dp[i][j']+dp[i'][j]  (i<=i'<=j'<=j)

并且c[i][j]单调,也就是c[i][j]<=c[i+1][j]<=c[i+1][j+1]

#include<stdio.h>
#include<string.h>
int dp[205][205], c[205][205], a[205], sum[205];
int main(void)
{
	int n, i, j, k;
	while(scanf("%d", &n)!=EOF)
	{
		for(i=1;i<=n;i++)
		{
			scanf("%d", &a[i]);
			sum[i] = sum[i-1]+a[i];
		}
		memset(dp, 62, sizeof(dp));
		for(i=1;i<=n;i++)
		{
			dp[i][i] = 0;
			c[i][i] = i;
		}
		for(k=1;k<=n-1;k++)
		{
			for(i=1;i+k<=n;i++)
			{
				for(j=c[i][i+k-1];j<=c[i+1][i+k];j++)
				{
					if(j<=i+k-1 && dp[i][j]+dp[j+1][i+k]<dp[i][i+k])
					{
						dp[i][i+k] = dp[i][j]+dp[j+1][i+k];
						c[i][i+k] = j;
					}
				}
				dp[i][i+k] += sum[i+k]-sum[i-1];
			}
		}
		printf("%d\n", dp[1][n]);			 
	}
	return 0;
}


利用 TensorFlow 训练自己的目标识别器。本文内容来自于我的毕业设计,基于 TensorFlow 1.15.0,其他 TensorFlow 版本运行可能存在问题。.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值