SRM553 Div1Medium TwoConvexShapes
来源:互联网 发布:淘宝商家管理系统 编辑:程序博客网 时间:2024/06/06 00:07
我们发现最终的合法图在黑白块的分界线处形成了不增或不降的序列
然后推出递推式:
然后对于每一种情况dp就行了
当然黑白分割线水平或竖直的时候有情况重复
整张图全黑或全白的时候也有重复,需要减去
总之,照
代码如下:
#include <bits/stdc++.h>using namespace std;#define P 1000000007#define M 51#define Max(a,b) if(a<b)a=b#define Min(a,b) if(a>b)a=bint n,m,ans;char str[M][M];int a[M][M];int dp[M][M];int up[M],down[M];int getval(char c){ if(c=='B')return 1; if(c=='W')return 2; return 0;}void solve(){ memset(dp,0,sizeof(dp)); for(int i=1;i<=m;i++) up[i]=0,down[i]=n+1; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(a[i][j]&1)Min(down[j],i); if(a[i][j]&2)Max(up[j],i); } for(int i=up[1];i<down[1];i++)dp[1][i]=1; for(int j=2;j<=m;j++) for(int k=up[j];k<down[j];k++) for(int t=k;t>=0;t--) dp[j][k]=(dp[j][k]+dp[j-1][t])%P; for(int i=0;i<=n;i++) ans=(ans+dp[m][i])%P;}bool check(int l1,int r1,int l2,int r2,int v){ for(int i=l1;i<=r1;i++) for(int j=l2;j<=r2;j++) if(a[i][j]==v)return 0; return 1;}void delt(){ int f=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ f|=a[i][j]=getval(str[i][j]); } if((f&1)==0)ans-=3; if((f&2)==0)ans-=3; for(int i=1;i<m;i++){ if(check(1,n,1,i,1)&&check(1,n,i+1,m,2))ans--; if(check(1,n,1,i,2)&&check(1,n,i+1,m,1))ans--; } for(int i=1;i<n;i++){ if(check(1,i,1,m,1)&&check(i+1,n,1,m,2))ans--; if(check(1,i,1,m,2)&&check(i+1,n,1,m,1))ans--; }}int main(){ scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) scanf("%s",str[i]+1); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=getval(str[i][j]); solve(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][m-j+1]=getval(str[i][j]); solve(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[n-i+1][j]=getval(str[i][j]); solve(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[n-i+1][m-j+1]=getval(str[i][j]); solve(); delt(); printf("%d\n",ans); return 0;}
阅读全文
1 0
- SRM553 Div1Medium TwoConvexShapes
- SRM553 Div1Medium TwoConvexShapes
- SRM553
- SRM 553 - 500 TwoConvexShapes
- SRM553 Div1 500
- SRM548 Div1Medium KingdomAndDice
- SRM551 Div1Medium ColorfulWolves
- SRM573 Div1Medium Ski Resorts
- SRM574 Div1Medium PolygonTraversal
- SRM579 Div1Medium TravellingPurchasingMan
- SRM588 Div1Medium KeyDungeonDiv1
- SRM589 Div1Medium GearsDiv1
- SRM554 Div1Medium TheBrickTowerMediumDivOne
- SRM548 Div1Medium KingdomAndDice
- SRM551 Div1Medium ColorfulWolves
- SRM593 Div1Medium MayTheBestPetWin
- SRM573 Div1Medium Ski Resorts
- SRM579 Div1Medium TravellingPurchasingMan
- SQL存储过程的调用及写法
- 服务器重启后网站可以打开,一会网站就打不开
- SQL 2008 windows登录失败,错误18456, 更正
- 关于vs调试正确。但是发布到iis就出现无法访问后天局面
- --------------------------------新博《大城小爱》分界线------------------------------------
- SRM553 Div1Medium TwoConvexShapes
- 由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例。该连接将关闭。
- SQL2012连接字符串
- 认识泛型数据
- Visio连接数据表实体外键[快捷记录]
- B 树、B+ 树、B* 树
- Hadoop-Streaming实战经验及问题解决方法总结
- 一点心得
- MVC 数据验证[转]