80pts TLE,求助大佬这种方法能不能优化。
#include<bits/stdc++.h>
#define MAXN 10010
#define MAXM 1010
#define INF 1000000000
using namespace std;
struct guandao{
int pos,up_line,down_line;
};
guandao gu[MAXN];
int n,m,k;
int up[MAXN],down[MAXN];
int f[MAXM][MAXN];
int book[MAXN],vis[MAXN];
int main(){
// freopen("bird.in","r",stdin);
// freopen("bird.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++){
scanf("%d%d",&up[i],&down[i]);
}
for(int i=1;i<=k;i++){
scanf("%d%d%d",&gu[i].pos,&gu[i].down_line,&gu[i].up_line);
book[gu[i].pos]=i;
}
memset(f,0x3f,sizeof(f));
for(int i=0;i<m;i++){
f[i][0]=0;
}
for(int i=0;i<n;i++){
// cout<<"--------------------"<<endl;
for(int j=0;j<m;j++){
// cout<<f[j][i]<<endl;
if(f[j][i]<INF){
vis[i]=true;
// cout<<"*"<<endl;
for(int s=1;s<=j/up[i];s++){
// printf("(%d,%d)->(%d,%d) %d->%d\n",j,i,j-s*up[i],i+1,f[j-s*up[i]][i+1],min(f[j-s*up[i]][i+1],f[j][i]+s));
// cout<<f[j-s*up[i]][i+1]<<endl;
f[j-s*up[i]][i+1]=min(f[j-s*up[i]][i+1],f[j][i]+s);
// cout<<f[j-s*up[i]][i+1]<<endl;
}
// cout<<j<<" "<<up[i]<<endl;
if(j%up[i]||j==0){
// printf("(%d,%d)->(%d,%d) %d->%d\n",j,i,0,i+1,f[0][i+1],min(f[0][i+1],f[j][i]+j/up[i]+1));
f[0][i+1]=min(f[0][i+1],f[j][i]+j/up[i]+1);
// cout<<f[0][i+1]<<endl;
}
if(j+down[i]<m){
// printf("(%d,%d)->(%d,%d) %d->%d\n",j,i,j+down[i],i+1,f[j+down[i]][i+1],min(f[j+down[i]][i+1],f[j][i]));
f[j+down[i]][i+1]=min(f[j+down[i]][i+1],f[j][i]);
// printf("%d\n",f[j+down[i]][i+1]);
}
// cout<<book[i+1]<<endl;;
}
}
if(book[i+1]){
// cout<<i<<endl;
for(int u=0;u<=m-gu[book[i+1]].up_line;u++){
f[u][i+1]=INF+10;
// cout<<u<<endl;
}
// cout<<endl;
for(int d=m;d>=m-gu[book[i+1]].down_line;d--){
f[d][i+1]=INF+10;
// cout<<d<<endl;
}
}
// for(int i=0;i<=m;i++){
// for(int j=0;j<=n;j++){
// if(f[i][j]<INF)
// printf("%-4d",f[i][j]);
// else
// cout<<"*"<<" ";
// }
// cout<<endl;
// }
}
int ans=INF;
for(int i=0;i<=m;i++){
ans=min(ans,f[i][n]);
}
if(ans<INF){
printf("1\n%d\n",ans);
}else{
ans=0;
for(int i=0;i<n;i++){
if(book[i]&&vis[i]){
ans++;
}else if(!vis[i]){
break;
}
}
printf("0\n%d\n",ans);
}
return 0;
}
/*
10 10 6
3 9
9 9
1 2
1 3
1 2
1 1
2 1
2 1
1 6
2 2
1 2 7
5 1 5
6 3 5
7 5 8
8 7 9
9 1 3
*/
/*
10 10 4
1 2
3 1
2 2
1 8
1 8
3 2
2 1
2 1
2 2
1 2
1 0 2
6 7 9
9 1 4
3 8 10
*/