JZOJ5259. 线性规划问题
2017-08-11 16:22
197 查看
分析
非常容易就可以想到一个三维状态:fi,j,k表示当前是序列的第i个位置,前面选的a的和是j,b的和是k的最小值。
转移很显然。
但是这只能得到50分。
我们考虑压缩一下状态,
设fi,j
表示第i个位置,a的和≤j,b的和≥j的最小值。
这样状态就是二维的,
转移:
fi,j=∑j−aik=j−biminfi−1,k
这里是要求连续的一个区间中的最小值,
想到用单调队列。
每次将fi−1,j−ai 进队,
判断对首的进队时间是否早于j−bi
更新当前状态fi,j
上面是xi=1 的情况的转移,
xi=0 的情况转移就非常简单了,
就是fi,j=min(fi,j,fi−1,j)
code
#include<cstdio> #include<iostream> #include<algorithm> #include <cstring> #include <string.h> #include <cmath> #include <math.h> #define ll long long #define N 1003 #define db double #define P putchar #define G getchar #define mo 23332333 using namespace std; char ch; void read(int &n) { n=0; ch=G(); while((ch<'0' || ch>'9') && ch!='-')ch=G(); int w=1; if(ch=='-')w=-1,ch=G(); while('0'<=ch && ch<='9')n=n*10+ch-'0',ch=G(); n*=w; } void write(int x) { if(x>9) write(x/10); P(x%10+'0'); } int f[2][N*10],w,a ,b ,c ,l,r,d[N*10],ti[N*10]; int T,n,p; int main() { read(T); while(T--) { read(n);read(p); for(int i=1;i<=n;i++) read(a[i]); for(int i=1;i<=n;i++) read(b[i]); for(int i=1;i<=n;i++) read(c[i]); memset(f[w],127,sizeof(f[w]));f[w][0]=0; for(int i=1;i<=n;i++) { w=1-w; memcpy(f[w],f[1-w],sizeof(f[w])); l=1;r=0; for(int j=a[i];j<=p;j++) { /*for(int k=max(0,j-b[i]);k<=j-a[i];k++) f[w][j]=min(f[w][j],f[1-w][k]+c[i]);*/ while(l<=r && d[r]>=f[1-w][j-a[i]])r--; d[++r]=f[1-w][j-a[i]];ti[r]=j-a[i]; while(ti[l]<j-b[i])l++; f[w][j]=min(f[w][j],d[l]+c[i]); } } if(f[w][p]>1000000000)P('I'),P('M'),P('P'),P('O'),P('S'),P('S'),P('I'),P('B'),P('L'),P('E'),P('!'),P('!'),P('!'); else write(f[w][p]); P('\n'); } }
相关文章推荐
- jzoj5259 线性规划问题 (巧妙设状态的dp)
- 线性规划与网络流24题 2太空飞行计划问题 最大权闭合图问题(不懂) nefu 476
- 【线性规划与网络流24题 7】试题库问题
- 利用两阶段法通过寻找基可行解求线性规划问题的最优解
- 线性规划与网络流24题 09方格取数问题
- 线性规划与网络流24——最长递增子序列问题
- 网络流与线性规划24题03最小路径覆盖问题
- 线性规划与网络流24题 餐巾计划问题
- 线性规划与网络流24题之最长k可重区间集问题 最大权不相交路径(最大费用最大流)
- 线性规划与网络流24题之 魔术球问题
- 几类可以神奇转化为线性规划的问题matlab求解
- 线性规划与网络流24题 太空飞行计划问题 (最小割及输出方案)
- 【线性规划与网络流24题】孤岛营救问题 分层图
- 线性规划与网络流24题 3.最小路径覆盖问题(nefu 481)
- 动态规划之线性动规钢条切割问题
- 线性规划与网络流24题之餐巾计划问题 最小费用最大流
- 线性规划问题的matlab求解
- 线性规划问题解决开源工具(GNU Linear Programming Kit)
- 线性动态规划——解最长公共子序列问题
- 网络流解线性规划问题 BZOJ1061: [Noi2008]志愿者招募