BZOJ 1068 (区间DP)

时间:2021-05-11 09:58:31

题意:有n个宝藏,在x轴上,每个宝藏在某个时间会消失,问最少吃完所有宝藏的时间是多少,否则输出no solution

分析:区间DP,f[i][j][01]代表i到j区间内的全部吃完,停留在左/右端,不过这个时间空间也是水,不知道怎么出的题目。。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
int n,f[][][],p[],t[];
int read(){
char ch=getchar();int f=,t=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
int main(){
while (scanf("%d",&n)!=EOF){
for (int i=;i<=n;i++){
p[i]=read();
       t[i]=read();
     }for (int i=n-;i>=;i--)
for (int j=i+;j<=n;j++){
f[i][j][]=std::min(f[i+][j][]+p[i+]-p[i],f[i+][j][]+p[j]-p[i]);
f[i][j][]=std::min(f[i][j-][]+p[j]-p[j-],f[i][j-][]+p[j]-p[i]);
if (f[i][j][]>=t[i]) f[i][j][]=;
if (f[i][j][]>=t[j]) f[i][j][]=;
}
int x=std::min(f[][n][],f[][n][]);
if (x<) printf("%d\n",x);
else printf("No solution\n");
memset(f,,sizeof (f));
}
}