区间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(我太弱啦!
就让我永远不在这里写下什么有意义的话——by 吉林神犇 alone_wolf