区间dp板子题:[noi1995]石子合并

非常经典的区间dp模板

对于每一个大于二的区间 我们显然都可以将它拆分成两个子序列 那么分别计算对于每个取最优值即可

#pragma GCC optimize("O2")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<limits.h>
#include<ctime>
#define N 100001
typedef long long ll;
const int inf=0x3fffffff;
const int maxn=2017;
using namespace std;
inline int read()
{
    int f=1,x=0;char ch=getchar();
    while(ch>'9'|ch<'0')
    {
        if(ch=='-')
        f=-1;
        ch=getchar();
    }
    while(ch<='9'&&ch>='0')
    {
        x=(x<<3)+(x<<1)+ch-'0';
        ch=getchar();
    }
    return f*x;
}
int dp[maxn][maxn],a[N],sum[N];
int main()
{
	int n=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		sum[i]=sum[i-1]+a[i];
	} 
	for(int len=1;len<=n;len++)
	{
		for(int l=1,r;(r=l+len)<=n;l++)
		{
		    dp[l][r]=inf;
			for(int k=l;k<r;k++)
			dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]+sum[r]-sum[l-1]);
		}
	}
	cout<<dp[1][n];
} 

另外强烈安利这篇讲区间dp的  全网最棒!强推一波!

顺便我居然才开始学区间dp(我太弱啦!

posted @ 2017-09-06 17:19  a799091501  阅读(207)  评论(0编辑  收藏  举报