本文主要是介绍51Nod 1022 石子归并 V2 (划分型dp四边形不等式优化),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
上式在动态规划的状态转移方程中是很常见的,对于上式中的w(i,j)
如果符合w(i`,j) <= w(i,j`) i<i`<j<j` 那么我们称函数w满足关于区间包含的单调性
如果符合w(i,j)+w(i`,j`) <= w(i`,j)+w(i,j`) 那么我们称函数w满足四边形不等式
那么,有两个定理:(图片取自http://blog.csdn.net/shiwei408/article/details/8791011)
第1行:N(2 <= N <= 1000) 第2 - N + 1:N堆石子的数量(1 <= A[i] <= 10000)
输出最小合并代价
4 1 2 3 4
19
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<stdio.h>using namespace std;const int N = 2009;
int n,f[N][N]={0},a[N][N]={0};
int s[N][N];int main()
{memset(f,1,sizeof(f));scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i][i]);a[n+i][n+i] = a[i][i];}for(int i=0;i<n*2;i++){s[i][i] = i;f[i][i] = 0;}for(int i=0;i<n*2-1;i++)for(int j=i+1;j<n*2-1;j++)a[i][j] = a[i][j-1] + a[j][j];for(int l=1;l<n;l++){for(int i=0;i+l<n*2-1;i++){int j = i+l;for(int k=s[i][j-1];k<=s[i+1][j];k++){if(f[i][j] > a[i][j]+f[i][k]+f[k+1][j]){f[i][j] = a[i][j]+f[i][k]+f[k+1][j];s[i][j] = k;}}}}int ans = f[0][n-1];for(int i=1;i<n;i++)if(ans > f[i][i+n-1])ans = f[i][i+n-1];printf("%d\n",ans);return 0;
}
这篇关于51Nod 1022 石子归并 V2 (划分型dp四边形不等式优化)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!