首页 > 代码库 > bzoj3208:花神的秒题计划I
bzoj3208:花神的秒题计划I
思路:因为Q、S、B操作总和不超过100,因此怎么暴力怎么写。。。。当然记忆化搜索还是要的
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; #define maxn 705 const int lx[]={-1,0,1,0}; const int ly[]={0,-1,0,1}; int n,m; int a[maxn][maxn],f[maxn][maxn]; bool can[maxn][maxn]; char s[10]; inline int read(){ int x=0;char ch=getchar(); for (;ch<‘0‘||ch>‘9‘;ch=getchar()); for (;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-‘0‘; return x; } int dp(int x,int y){ if (!can[x][y]) return -n*n; if (f[x][y]) return f[x][y]; f[x][y]=1; for (int i=0;i<4;i++){ int nx=x+lx[i],ny=y+ly[i]; if (nx>0&&ny>0&&nx<=n&&ny<=n&&a[x][y]>a[nx][ny]) f[x][y]=max(f[x][y],dp(nx,ny)+1); } return f[x][y]; } int main(){ n=read(); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) a[i][j]=read(); m=read();memset(can,1,sizeof(can)); while (m--){ scanf("%s",s+1); if (s[1]==‘C‘){int x=read(),y=read(),v=read();a[x][y]=v;} if (s[1]==‘S‘){ int a=read(),b=read(),c=read(),d=read(); for (int i=a;i<=c;i++) for (int j=b;j<=d;j++) can[i][j]=0; } if (s[1]==‘B‘){ int a=read(),b=read(),c=read(),d=read(); for (int i=a;i<=c;i++) for (int j=b;j<=d;j++) can[i][j]=1; } if (s[1]==‘Q‘){ int ans=0;memset(f,0,sizeof(f)); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) ans=max(ans,dp(i,j)); printf("%d\n",ans); } } return 0; }
bzoj3208:花神的秒题计划I
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。