ccf 201612-4 压缩编码 石子合并问题(DP+平行四边形优化)

学无止境~

平行四边形优化为啥成立还在思考中~

//石子问题 平行四边形优化 
#include<iostream>
#define maxn 1002
#define inf 0x3fffffff
#define min(a,b) a<b?a:b
using namespace std;
int n;
int a[maxn],dp[maxn][maxn],p[maxn][maxn],sum[maxn];
int main(){
	scanf("%d",&n);
	sum[0] = 0;
	for(int i = 1;i<=n;i++){
		scanf("%d",&a[i]);
		dp[i][i] = 0;
		p[i][i] = i;
		sum[i] =  sum[i-1]+a[i];
	}
	for(int c = 1;c<n;c++){
		for(int i = 1;i<=n-c;i++){
			int val = inf,j = i+c,kk;
			int total = sum[j]-sum[i-1];
			for(int k = p[i][i+c-1];k<=p[i+1][i+c]&&k<j;k++){
				if(dp[i][k]+dp[k+1][j]+total<val){
					val = dp[i][k]+dp[k+1][j]+total;
					kk = k;
				}
			}
			dp[i][j] = val;
			p[i][j] = kk;
//			cout<<i<<"  "<<j<<"  "<<kk<<"  "<<dp[i][j]<<endl;
		}
	}
	printf("%d\n",dp[1][n]);
	
	
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值