DP模板之---区间DP

作者: 旧人旧事旧时光_4d20 | 来源:发表于2018-10-26 00:35 被阅读0次

一.经典例题

题目地址:

【P1880】[NOI1995]石子合并 - 洛谷

二.分析

转移方程

dp_max[i][j]=max(dp_max[i][k]+dp_max[k+1][j],dp_max[i][j])+sum(i,j);

dp_min[i][j]=min(dp_min[i][k]+dp_min[k+1][j],dp_min[i][j])+sum(i,j);

代码


#include <iostream>

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <cstdlib>

using namespace std;

int n;

int a[1000005];

int dp_max[1005][1005];

int dp_min[1005][1005];

int sum[1005];

int main(){

cin>>n;

for(int i=1;i<=n;i++)

{

cin>>a[i];

a[n+i]=a[i];

}

for(int i=1;i<=n*2;i++)

{

sum[i]=sum[i-1]+a[i];

dp_max[i][i]=dp_min[i][i]=0;

}

for(int l=2;l<=n;l++)

{

for(int i=1;i<=2*n-l+1;i++)

{

int j=i+l-1;

dp_max[i][j]=0;

dp_min[i][j]=0x3f3f3f;

for(int k=i;k<j;k++)

{

dp_max[i][j]=max(dp_max[i][k]+dp_max[k+1][j],dp_max[i][j]);

dp_min[i][j]=min(dp_min[i][k]+dp_min[k+1][j],dp_min[i][j]);

}

dp_max[i][j]+=sum[j]-sum[i-1];

dp_min[i][j]+=sum[j]-sum[i-1];

}

}

int ans1=0,ans2=0x3f3f3f;

for(int i=1;i<=n;i++)

{

ans1=max(dp_max[i][i+n-1],ans1);

ans2=min(dp_min[i][i+n-1],ans2);

}

cout<<ans2<<endl<<ans1<<endl;

return 0;

}

相关文章

  • DP模板之---区间DP

    一.经典例题 题目地址: 【P1880】[NOI1995]石子合并 - 洛谷 二.分析 转移方程 dp_max[i...

  • 区间DP

    模板区间dp一般由小区间推出大的区间: http://acm.hdu.edu.cn/showproblem.php...

  • 「动态规划」例题之状态和转移方程的设计(2)

    0x50「动态规划」例题 区间DP 线性DP从初态开始,沿着“阶段”向某个方向扩张。而区间DP是线性DP的一种,它...

  • DP小结

    DP种类 线性DP 区间DP 树形DP 背包DP01背包满背包完全背包(转成01背包) 例子:线性动规:拦截导弹,...

  • 区间DP和回文为主题的DP

    区间DP 区间DP的特征: 可以两个或多个部分进行整合, 或者反过来;能将问题分解为能两两合并的形式.区间DP的求...

  • 区间DP

    区间DP,对于每段小区间,它的最优值是由更小的区间的最优值得出的,由此往下划分,直到单个元素,由他们的组合合并得出...

  • 区间DP

    石子合并 原题链接[https://www.acwing.com/problem/content/284/] 2....

  • 区间类DP总结

    区间类DP的做法,是用memorized search,把大区间拆分为小区间来解。而dp[i][j] 则直观的表示...

  • LeetCode 区间dp

    1553. 吃掉 N 个橘子的最少天数 5498. 石子游戏 V

  • 区间dp入门

    题目:洛谷P1040加分二叉树[https://www.luogu.com.cn/problem/P1040]大意...

网友评论

    本文标题:DP模板之---区间DP

    本文链接:https://www.haomeiwen.com/subject/vzvhtqtx.html