Ural 1287

来源:互联网 发布:h5微场景源码 编辑:程序博客网 时间:2024/06/03 04:10

PRO IS HERE


n*n矩阵,统计连续的横,竖,斜的'S' 和 's' 的个数的最大值,输出较大的那个。

暴力dp

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<set>#include<queue>#include<map>using namespace std;#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)#define bug puts("Fuck");#define LL long long#define pb push_back#define mp make_pair#define nMax 1410#define eps 1e-8#define inf 0x7fffffffint dp[nMax][nMax][2][4];char s[nMax][nMax];int n;int l[2];int dx[]={0,-1,-1,-1};int dy[]={-1,-1,0,1};void sovle(){l[0]=l[1]=0;FOR(i,1,n) FOR(j,1,n) FOR(k,0,1) FOR(z,0,3)if(s[i][j] == k) {dp[i][j][k][z] = dp[i+dx[z]][j+dy[z]][k][z] + (s[i][j]==k?1:0);if(dp[i][j][k][z] > l[k]) l[k]=dp[i][j][k][z];}else dp[i][j][k][z] = 0;//printf("%d %d\n",l[0],l[1]);if(l[0]>l[1]) printf("s\n%d\n",l[0]);else if(l[0]<l[1]) printf("S\n%d\n",l[1]);else printf("?\n%d\n",l[0]);}int main(){#ifndef ONLINE_JUDGE  freopen("input.txt","r",stdin);//freopen("output.txt","w",stdout);#endifwhile(~scanf("%d",&n)){FOR(i,1,n) {scanf("%s",s[i]+1);FOR(j,1,n) s[i][j] = (s[i][j]=='s' ? 0 : 1);}sovle();}return 0;}



原创粉丝点击