这好像是个暴力?

但是跑的挺快的

我们设\(dp[i][j][k]\)表示在第\(i\)行我们最远染到的位置是\(j\),这一行上一共染了\(k\)次最多能染对多少个格子

理性分析一下啊,每一行最多也就染\(m\)次,这样就能把这一行格子全部都染对

所以这个空间复杂度是\(nm^2\)的

之后考虑一下转移

显然这就是一个非常经典的断点\(dp\)了,转移为

\[dp[i][j][k]=max(dp[i][p][k-1]+max(s_0[p+1,j],s_1[p+1,j]))
\]

\(s_0[p+1,j]\)表示这个区间内有几个\(0\),后面那个也就是我们能够正确覆盖的格子数量

最后用分组背包合并大案就好了

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#define max(a,b) ((a)>(b)?(a):(b))
#define re register
int dp[51][51][51];
int pre[51][51][2];
char S[51][51];
int f[2501];
int n,m,T;
int main()
{
scanf("%d%d%d",&n,&m,&T);
for(re int i=1;i<=n;i++)
{
scanf("%s",S[i]+1);
for(re int j=1;j<=m;j++)
if(S[i][j]=='1') pre[i][j][1]=pre[i][j-1][1]+1,pre[i][j][0]=pre[i][j-1][0];
else pre[i][j][1]=pre[i][j-1][1],pre[i][j][0]=pre[i][j-1][0]+1;
}
for(re int i=1;i<=n;i++)
for(re int j=1;j<=m;j++)
for(re int k=1;k<=j;k++)
for(re int p=0;p<j;p++)
dp[i][j][k]=max(dp[i][j][k],dp[i][p][k-1]+max(pre[i][j][0]-pre[i][p][0],pre[i][j][1]-pre[i][p][1]));
for(re int i=1;i<=n;i++)
for(re int j=T;j>=0;j--)
for(re int k=0;k<=m;k++)
if(j-k>=0) f[j]=max(f[j],f[j-k]+dp[i][m][k]);
printf("%d\n",f[T]);
return 0;
}

最新文章

  1. [Java] JSP笔记 - Listener 监听器
  2. sql编程(四)触发器
  3. Edittext默认无焦点
  4. 不支持关键字“data source”
  5. (原创)古典主义&mdash;&mdash;平凡之美 佳作欣赏(摄影,欣赏)
  6. linux上课
  7. 【java 断点续传】
  8. 浅析WINFORM工具条的重用实现
  9. openstack liberty 版本按照官方文档手动整合 完成后 基于dashboard-horizon 创建虚拟机报错 用CL却是成功的 网络等验证都是正确的通过启动的虚拟实例测试以成功
  10. C primer plus 读书笔记第八章
  11. C++输出hello world 详细注释
  12. 使用WeCloud消息推送接口发送消息NodeJs版
  13. Ansible9:条件语句【转】
  14. 2017计算机学科夏令营上机考试-B编码字符串
  15. 【转】Linux从入门到精通——运维工程师成长路线图——CTO马哥Linux视频教学
  16. 利用ICSharpCode.SharpZipLib进行压缩
  17. LCT总结(LCT,Splay)
  18. jquery ajax几种书写方式的总结
  19. bootstrap_栅格系统_响应式工具_源码分析
  20. react路由嵌套

热门文章

  1. python - 约瑟夫问题
  2. 【C#】隐式类型var
  3. (六-1)Firefox插件安装
  4. javascript移动端滑屏事件
  5. 初学Hadoop之WordCount词频统计
  6. node.js中的模板引擎jade、handlebars、ejs
  7. 远程SQL Server连接不上
  8. SQL语句执行与结果集的获取
  9. oracle相关常识
  10. SQLAlchemy的使用---数据库的创建与连接