SRM552 Div1Medium FoxAndFlowerShopDivOne
来源:互联网 发布:visio linux 编辑:程序博客网 时间:2024/06/06 03:42
这题只需枚举一条中间线,将整个田地分成两半
然后分别计算两边对于某一个
而后只需要扫一遍所有可行的的情况取最大值即可
代码如下:
#include<bits/stdc++.h>using namespace std;#define M 35#define N 905#define Max(a,b) if(a<b)a=bchar str[M];int A[M][M];int n,m,k,ans=-1;int sum[M][M],f[M][M];int val1[N*2],val2[N*2];void solve1(int x){ memset(val1,-1,sizeof(val1)); memset(val2,-1,sizeof(val2)); for(int a=1;a<=x;a++) for(int b=a;b<=x;b++) for(int c=1;c<=m;c++) for(int d=c;d<=m;d++){ int F=f[b][d]-f[b][c-1]-f[a-1][d]+f[a-1][c-1], SUM=sum[b][d]-sum[b][c-1]-sum[a-1][d]+sum[a-1][c-1]; Max(val1[F+N],SUM); } for(int a=x+1;a<=n;a++) for(int b=a;b<=n;b++) for(int c=1;c<=m;c++) for(int d=c;d<=m;d++){ int F=f[b][d]-f[b][c-1]-f[a-1][d]+f[a-1][c-1], SUM=sum[b][d]-sum[b][c-1]-sum[a-1][d]+sum[a-1][c-1]; Max(val2[F+N],SUM); } for(int i=-n*m;i<=n*m;i++){ if(val1[i+N]==-1)continue; int res=-1; for(int j=max(-k-i,-n*m);j<=min(n*m,k-i);j++) Max(res,val2[j+N]); if(~res)Max(ans,res+val1[i+N]); }}int solve2(int x){ memset(val1,-1,sizeof(val1)); memset(val2,-1,sizeof(val2)); for(int a=1;a<=n;a++) for(int b=a;b<=n;b++) for(int c=1;c<=x;c++) for(int d=c;d<=x;d++){ int F=f[b][d]-f[b][c-1]-f[a-1][d]+f[a-1][c-1], SUM=sum[b][d]-sum[b][c-1]-sum[a-1][d]+sum[a-1][c-1]; Max(val1[F+N],SUM); } for(int a=1;a<=n;a++) for(int b=a;b<=n;b++) for(int c=x+1;c<=m;c++) for(int d=c;d<=m;d++){ int F=f[b][d]-f[b][c-1]-f[a-1][d]+f[a-1][c-1], SUM=sum[b][d]-sum[b][c-1]-sum[a-1][d]+sum[a-1][c-1]; Max(val2[F+N],SUM); } for(int i=-n*m;i<=n*m;i++){ if(val1[i+N]==-1)continue; int res=-1; for(int j=max(-k-i,-n*m);j<=min(n*m,k-i);j++) Max(res,val2[j+N]); if(~res)Max(ans,res+val1[i+N]); }}int main(){ scanf("%d %d %d",&n,&m,&k); for(int i=1;i<=n;i++){ scanf("%s",str+1); for(int j=1;j<=m;j++){ if(str[j]=='L')A[i][j]=1; else if(str[j]=='P')A[i][j]=-1; } } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ f[i][j]=f[i-1][j]+f[i][j-1]+A[i][j]-f[i-1][j-1]; sum[i][j]=sum[i-1][j]+sum[i][j-1]+(A[i][j]!=0)-sum[i-1][j-1]; } for(int i=1;i<n;i++)solve1(i); for(int j=1;j<m;j++)solve2(j); printf("%d\n",ans); return 0;}
阅读全文
1 0
- SRM552 Div1Medium FoxAndFlowerShopDivOne
- SRM552 Div1Medium FoxAndFlowerShopDivOne
- SRM552
- SRM552 FoxPlusMinus
- SRM 552 - 500 FoxAndFlowerShopDivOne
- Topcoder SRM552 Div1 500
- SRM552题解 (T3除外)
- 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
- C#剪切,复制,粘贴底层应用编写
- ThinkPHP中实例化对象M()和D()的区别,select和find的区别
- thinkphp 模板显示display和assign的用法
- ThinkPHP分页实例
- C#通过Http发送Soap请求
- SRM552 Div1Medium FoxAndFlowerShopDivOne
- C# 将类的内容写成JSON格式的字符串
- C# JSON格式的字符串读取到类中
- 自己总结下颜色表
- python 语法细节
- WinForm DataGridView 绑定泛型List(List<T>)/ArrayList不显示的原因和解决
- Windows7安装JDK的环境变量设置javac不是内部命令或外部命令
- [zz]使用OleDb,将Excel导入DataSet
- [zz]winform导入excel