事实证明即使是水题也不能乱写暴力= =
以为暴力加点剪枝就能过了嘛,然后就怒写暴力= =
前车之鉴:
Problem: 1088 User: BPM136 Memory: N/A Time: N/A Language: G++ Result: Time Limit Exceeded #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #define LL long long #define fo(i,a,b) for(int i=a;i<=b;i++) #define down(i,a,b) for(int i=a;i>=b;i--) using namespace std; inline LL read() { LL d=0,f=1;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();} return d*f; } #define N 105 #define MAX 1000000000 int a[N][N]; int f[N][N]; int n,m,ans=1; int pre[4][2]; void getpre() { int cnt=0; fo(i,-1,1) fo(j,-1,1) if(abs(i-j)==1) { pre[cnt][0]=i;pre[cnt++][1]=j; } } //int v[N][N]; void dfs(int x,int y,int val,int anss) { if(x<1||y<1||x>n||y>m)return; // if(v[x][y]==1)return; if(a[x][y]>=val||f[x][y]>anss)return; int cost=anss+1;ans=max(ans,cost); f[x][y]=max(f[x][y],anss);//v[x][y]=1; fo(i,0,3) dfs(x+pre[i][0],y+pre[i][1],a[x][y],cost); // v[x][y]=0; } int main() { getpre(); n=read(),m=read(); fo(i,1,n) { fo(j,1,m) a[i][j]=read(); } fo(i,1,n) { fo(j,1,m) { // memset(v,0,sizeof(v)); dfs(i,j,MAX,0); } } cout<<ans<<endl; return 0; }然后我T了几次后决定还是写个规范点的记忆化搜索= =
Problem: 1088 User: BPM136 Memory: 804K Time: 32MS Language: G++ Result: Accepted #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #define LL long long #define fo(i,a,b) for(int i=a;i<=b;i++) #define down(i,a,b) for(int i=a;i>=b;i--) using namespace std; inline LL read() { LL d=0,f=1;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();} return d*f; } #define N 105 #define MAX 1000000000 int a[N][N]; int f[N][N]; int n,m,ans=-1; int pre[4][2]; void getpre() { int cnt=0; fo(i,-1,1) fo(j,-1,1) if(abs(i-j)==1) { pre[cnt][0]=i;pre[cnt++][1]=j; } } int dfs(int x,int y) { if(f[x][y])return f[x][y]; if(ans==n*m)return 0; fo(i,0,3) { int tx=x+pre[i][0],ty=y+pre[i][1]; if(tx>=1&&tx<=n&&ty>=1&&ty<=m) { if(a[tx][ty]<a[x][y]) { int ret=dfs(tx,ty); f[x][y]=max(f[x][y],ret+1); } } } return f[x][y]; } int main() { getpre(); scanf("%d%d",&n,&m); fo(i,1,n) { fo(j,1,m) scanf("%d",&a[i][j]); } fo(i,1,n) { fo(j,1,m) { int temp=dfs(i,j); ans=max(ans,temp); // cout<<f[i][j]<<' '; }//cout<<endl; } cout<<ans+1<<endl; return 0; }