Luogu 1880(区间dp)
来源:互联网 发布:mac 微信截图隐藏窗口 编辑:程序博客网 时间:2024/06/08 07:59
传送门
环形问题一般处理方法:把原数组复制一份到自己的尾部,然后按线性处理
此题就是普通石子合并的环形版,dp方程都一样。
中间有一步可以优化:当i,j两指针的间距大于n时可以continue,因为这样的范围是不合法的,不会影响答案。
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MAXN=102,INF=0x3f3f3f3f;int n,dp1[MAXN<<1][MAXN<<1],dp2[MAXN<<1][MAXN<<1],val[MAXN<<1];inline int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); return x*f;}int main() {// freopen("P1880.in","r",stdin); memset(dp1,INF,sizeof(dp1)),memset(dp2,0,sizeof(dp2)),val[0]=0; n=read(); for (int i=1;i<=n;++i) dp1[i][i]=dp1[i+n][i+n]=0,val[i]=val[i+n]=read(); for (int i=1;i<=(n<<1);++i) val[i]+=val[i-1]; for (int i=(n<<1)-1;i;--i) for (int j=i+1;j<=(n<<1);++j) { if (j-i+1>n) continue; for (int k=i;k<j;++k) {//not '<='!!! dp1[i][j]=min(dp1[i][j],dp1[i][k]+dp1[k+1][j]+val[j]-val[i-1]); dp2[i][j]=max(dp2[i][j],dp2[i][k]+dp2[k+1][j]+val[j]-val[i-1]); } } int minx=INF,maxx=0; for (int i=1;i<=n;++i) { minx=min(minx,dp1[i][i+n-1]); maxx=max(maxx,dp2[i][i+n-1]); } printf("%d\n%d\n",minx,maxx); return 0;}
阅读全文
0 0
- Luogu 1880(区间dp)
- Luogu 1040(区间dp)
- Luogu 1280(dp)
- Luogu 1282(dp)
- Luogu 1387(dp)
- Luogu 1156(dp)
- Luogu 1141(dp)
- Luogu 1351(树形dp)
- Luogu 1144(SPFA+dp)
- Luogu 1074(tarjan+dp)
- Luogu 2679(dp)(NOIP 2015)
- Luogu-P1025数的划分(dp)
- Luogu-P1057传球游戏(dp)
- Luogu 1273(树形dp)(背包dp)
- luogu p1122 DP
- luogu p3399 DP
- hdu4597(区间dp)
- poj1651 (区间dp)
- 树的重量 洛谷p1268
- Eclipse Class Decompiler在线安装方法
- RequireJs按需要加载angular模块和依赖,并且用r.js压缩打包js和css文件实现加载优化(图文)。
- C++手动扩栈
- 解析文件路径,获取文件名和扩展名
- Luogu 1880(区间dp)
- 已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。
- Go语言学习笔记-并发
- Unity_Window平台从本地读取图片并转化Texture2D
- Linux Shell for循环写法总结
- Java中为什么要使用泛型?
- JVM内存详解
- 解决方案
- 已有maven+spring+spring mvc项目,集成dubbo