这题一开始毫无头绪,后来发现抽象成模型后并不是很复杂
向上飞就是完全背包,向下飞就是01背包
但是细节方面还是比较麻烦,dp的程序好想好写不好AC
比如说:向右飞的过程中做完全背包,必须是0~m一起做,是一个整体
不能只做非墙的部分
还是得深思熟虑啊ToT
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 10005
#define MAXM 1005
#define INF 0x7f7f7f7f
using namespace std;
int n,m,k;
int f[MAXN][MAXM];
int X[MAXN],Y[MAXN];
int b[MAXN],Down[MAXN],Up[MAXN];
int main()
{
// freopen("data.in","r",stdin);
memset(f,0x7f,sizeof(f));
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++){
scanf("%d%d",&X[i],&Y[i]);
}
for(int i=0;i<=n;i++){
Down[i]=0; Up[i]=m+1;
}
for(int i=1;i<=k;i++){
int p;
scanf("%d",&p);
scanf("%d%d",&Down[p],&Up[p]);
}
for(int i=1;i<=m;i++){
f[0][i]=0;
}
int ans=INF;
int t=0;
for(int i=1;i<=n;i++){
int ok=0;
for(int j=Down[i-1]+1;j<Up[i-1];j++){
int temp=min(j+X[i-1],m);
f[i][temp]=min(f[i][temp],f[i-1][j]+1);
}
for(int j=1;j<=m;j++){
int temp=min(j+X[i-1],m);
f[i][temp]=min(f[i][temp],f[i][j]+1);
}
for(int j=0;j<=Down[i];j++){
f[i][j]=INF;
}
for(int j=Up[i];j<=m;j++){
f[i][j]=INF;
}
for(int j=Down[i]+1;j<Up[i];j++){
if(j+Y[i-1]<=m){
f[i][j]=min(f[i][j],f[i-1][j+Y[i-1]]);
}
if(f[i][j]!=INF){
ok=1;
}
}
if(!ok){
printf("0\n%d\n",t);
return 0;
}
if(Up[i]<=m){
t++;
}
}
for(int j=Down[n]+1;j<Up[n];j++){
ans=min(ans,f[n][j]);
}
printf("1\n%d\n",ans);
return 0;
}