发现有一些75分与我WA的一模一样。
然而就是不知道哪里出锅了。
#include<bits/stdc++.h>
using namespace std;
const int N=10002;
const int M=1002;
int n,m,K,up[N],minn=0x3f3f3f3f,down[N],f[N][M][2],sum[N];
int upcell(int x,int y){
int tmp=0;
if(x==0)return 1;
if(x%y)tmp++;
tmp+=x/y;
return tmp;
}
int main(){
scanf("%d%d%d",&n,&m,&K);
for(int i=0;i<n;i++)scanf("%d%d",&up[i],&down[i]);
memset(f,0x3f,sizeof f);
for(int i=1;i<=m;i++)f[0][i][0]=f[0][i][1]=0;
for(int i=1;i<=K;i++){
int p,l,h;
scanf("%d%d%d",&p,&l,&h);
sum[p]++;
for(int j=1;j<=l;j++)f[p][j][0]=f[p][j][1]=-1;
for(int j=h;j<=m;j++)f[p][j][0]=f[p][j][1]=-1;
}
for(int i=1;i<=n;i++)sum[i]=sum[i-1]+sum[i];
for(int i=1;i<=n;i++){
if(f[i][m][0]!=-1)
for(int j=1;j<=m;j++){
if(f[i-1][j][0]!=-1&&f[i-1][j][0]<=1e9)f[i][m][0]=min(f[i][m][0],f[i-1][j][0]+upcell(m-j,up[i-1]));
if(f[i-1][j][1]!=-1&&f[i-1][j][1]<=1e9)f[i][m][0]=min(f[i][m][0],f[i-1][j][1]+upcell(m-j,up[i-1]));
}
for(int j=1;j<=m;j++){
if(f[i][j][0]==-1)continue;
if(j-up[i-1]>0&&f[i-1][j-up[i-1]][0]!=-1&&f[i-1][j-up[i-1]][0]<=1e9)f[i][j][0]=min(f[i][j][0],f[i-1][j-up[i-1]][0]+1);
if(j-up[i-1]>0&&f[i-1][j-up[i-1]][1]!=-1&&f[i-1][j-up[i-1]][1]<=1e9)f[i][j][0]=min(f[i][j][0],f[i-1][j-up[i-1]][1]+1);
if(j-up[i-1]>0&&f[i][j-up[i-1]][0]!=-1&&f[i][j-up[i-1]][0]<=1e9)f[i][j][0]=min(f[i][j][0],f[i][j-up[i-1]][0]+1);
if(j+down[i-1]<=m&&f[i-1][j+down[i-1]][0]!=-1&&f[i-1][j+down[i-1]][0]<=1e9)f[i][j][1]=min(f[i][j][1],f[i-1][j+down[i-1]][0]);
if(j+down[i-1]<=m&&f[i-1][j+down[i-1]][1]!=-1&&f[i-1][j+down[i-1]][1]<=1e9)f[i][j][1]=min(f[i][j][1],f[i-1][j+down[i-1]][1]);
}
bool flag=false;
for(int j=1;j<=m;j++)if(f[i][j][0]<=1e9&&f[i][j][0]!=-1||f[i][j][1]<=1e9&&f[i][j][1]!=-1)flag=true;
if(!flag){
printf("0\n");
printf("%d\n",sum[i-1]);
return 0;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)printf("%d ",min(f[i][j][0],f[i][j][1]));
printf("\n");
}
for(int i=1;i<=m;i++)minn=min(minn,min(f[n][i][0],f[n][i][1]));
printf("1\n");
printf("%d\n",minn);
return 0;
}