Problem: SLIKAR
【题目描述】
Josip 是个奇怪的画家,他想画一幅由 N*N 个点组成的图, N 是一个 2 的乘方
数(1, 2, 4, 8, 16 等.)。每个点要么是黑色的,要么是白色的。 Josip 画画有一个习惯。
他用下列递归的方式画画:
1.如果图像只包含一个点,他可以以任意色画(黑或白)。
2.否则,他把图分成四个大小相等的正方形部分:
3.从四个中选出一个,用白色的填充。
4.从剩余的三个中选一个,用黑色的填充。
5.把剩余的二部分重新按相同的三步进行填充。
不久以后,他发现,用他的方法并不能画出所有的画。请你编一个程序帮他设计一
个画图方案,使得用他的方法画出的画与想得到的画之间的差距最少(不同点的个
数最少)。
【输入说明】
第一行为一个整数 N (1 ≤ N ≤ 512),表示 Josip 画的图的尽寸。 N 是 2 的乘方数。
后面有 N 行,每行由 N 个 0 或 1 组成,表示画中的黑白点。
【输出说明】
输出第一行为最少可能的不同点数。
后面 N 行输出 Josip 可以画出的与目标图最接近的图。
注,第二部分的图可能不唯一。
【约定】
有 50%的点, N 最多是 8。
【样例】
input
4
1111
1111
1111
1111
output
6
0011
0011
0111
1101

这题其实暴搜就可以了,这里我建了一棵四叉树,用来处理二维的区间问题

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5. int N,map[][],tot[][];
  6. char s[][];
  7. int work[][]={
  8. {},
  9. {,,,,},
  10. {,,,,},
  11. {,,,,},
  12. {,,,,},
  13. {,,,,},
  14. {,,,,},
  15. {,,,,},
  16. {,,,,},
  17. {,,,,},
  18. {,,,,},
  19. {,,,,},
  20. {,,,,},
  21. };
  22. struct node{
  23. int L,R,U,D,K,sum;
  24. }tr[];
  25. int Q(int U,int D,int L,int R)
  26. {
  27. return tot[D][R]-tot[U-][R]-tot[D][L-]+tot[U-][L-];
  28. }
  29. int S(int U,int D,int L,int R)
  30. {
  31. return (D-U+)*(R-L+);
  32. }
  33. void Build(int Node,int U,int D,int L,int R)
  34. {
  35. tr[Node].L=L;tr[Node].R=R;
  36. tr[Node].U=U;tr[Node].D=D;
  37. if(L==R)return;
  38. Build(*(Node-)+,U,(U+D)/,L,(L+R)/);
  39. Build(*(Node-)+,U,(U+D)/,(L+R)/+,R);
  40. Build(*(Node-)+,(U+D)/+,D,L,(L+R)/);
  41. Build(*(Node-)+,(U+D)/+,D,(L+R)/+,R);
  42. }
  43.  
  44. void Solve(int Node)
  45. {
  46. if(tr[Node].L==tr[Node].R){
  47. tr[Node].sum=;
  48. return;
  49. }
  50. int son[];
  51. son[]=*(Node-)+;son[]=*(Node-)+;
  52. son[]=*(Node-)+;son[]=*(Node-)+;
  53.  
  54. Solve(son[]);Solve(son[]);
  55. Solve(son[]);Solve(son[]);
  56.  
  57. int minn=,minp;
  58. int ss=S(tr[Node].U,tr[Node].D,tr[Node].L,tr[Node].R)/;
  59. for(int i=;i<=;i++)
  60. {
  61. int ret;
  62. int a=son[work[i][]],b=son[work[i][]];
  63. int c=son[work[i][]],d=son[work[i][]];
  64. ret=tr[a].sum+tr[b].sum;
  65. ret+=Q(tr[c].U,tr[c].D,tr[c].L,tr[c].R);
  66. ret+=ss-Q(tr[d].U,tr[d].D,tr[d].L,tr[d].R);
  67. if(ret<minn){
  68. minn=ret;
  69. minp=i;
  70. }
  71. }
  72. int a=son[work[minp][]],b=son[work[minp][]];
  73. int c=son[work[minp][]],d=son[work[minp][]];
  74. tr[a].K=tr[b].K=;
  75. tr[c].K=;tr[d].K=;
  76. tr[Node].sum=minn;
  77. return;
  78. }
  79.  
  80. void Paint(int Node)
  81. {
  82. int son[];
  83. son[]=*(Node-)+;son[]=*(Node-)+;
  84. son[]=*(Node-)+;son[]=*(Node-)+;
  85.  
  86. if(tr[Node].K==){
  87. if(tr[Node].L==tr[Node].R)
  88. return;
  89. Paint(son[]);Paint(son[]);
  90. Paint(son[]);Paint(son[]);
  91. }
  92. else{
  93. for(int i=tr[Node].U;i<=tr[Node].D;i++)
  94. for(int j=tr[Node].L;j<=tr[Node].R;j++)
  95. map[i][j]=tr[Node].K;
  96. }
  97. }
  98. int main()
  99. {
  100. freopen("slikar.in","r",stdin);
  101. freopen("slikar.out","w",stdout);
  102. scanf("%d",&N);
  103. for(int i=;i<=N;i++)scanf("%s",s[i]+);
  104. for(int i=;i<=N;i++)
  105. for(int j=;j<=N;j++)
  106. {
  107. map[i][j]=s[i][j]-'';
  108. map[i][j]+=map[i][j-];
  109. }
  110.  
  111. for(int i=;i<=N;i++)
  112. for(int j=;j<=N;j++)
  113. tot[i][j]=tot[i-][j]+map[i][j];
  114.  
  115. Build(,,N,,N);
  116.  
  117. Solve();
  118.  
  119. for(int i=;i<=N;i++)
  120. for(int j=;j<=N;j++)
  121. map[i][j]=s[i][j]-'';
  122.  
  123. tr[].K=;
  124. Paint();
  125.  
  126. printf("%d\n",tr[].sum);
  127. for(int i=;i<=N;i++){
  128. for(int j=;j<=N;j++)
  129. printf("%d",map[i][j]);
  130. printf("\n");
  131. }
  132. return ;
  133. }

搜索与DP:SLIKAR的更多相关文章

  1. 记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof

    题目传送门 /* 记忆化搜索(DFS+DP):dp[x][y] 表示x个蛋,在y楼扔后所需要的实验次数 ans = min (ans, max (dp[x][y-i], dp[x-1][i-1]) + ...

  2. 记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty

    题目传送门 /* 题意:给了两堆牌,每次从首部取出一张牌,按颜色分配到两个新堆,分配过程两新堆的总数差不大于1 记忆化搜索(DFS+DP):我们思考如果我们将连续的两个操作看成一个集体操作,那么这个操 ...

  3. 搜索+简单dp

    前言:即使是简单的递归,在复杂度过高时也可以使用简单的dp. 一般有两种情况,一是利用dp思想求最优子结构进行搜索剪枝,二是利用搜索进行dp数组的填充. 例题一.hdu1978 题目大意:这是一个简单 ...

  4. UVALive 4864 Bit Counting --记忆化搜索 / 数位DP?

    题目链接: 题目链接 题意:如果一个数二进制n有k位1,那么f1[n] = k,如果k有s位二进制1,那么f2[n] = f1[k] = s.  如此往复,直到fx[n] = 1,此时的x就是n的”K ...

  5. hdu3555 Bomb (记忆化搜索 数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  6. HDU 2476 String painter(记忆化搜索, DP)

    题目大意: 给你两个串,有一个操作! 操作时可以把某个区间(L,R) 之间的所有字符变成同一个字符.现在给你两个串A,B要求最少的步骤把A串变成B串. 题目分析: 区间DP, 假如我们直接想把A变成B ...

  7. hdu_3562_B-number(记忆化搜索|数位DP)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3652 题意:给你一个n,为比n小的能整除13并数字中有13的数有多少个 题解:记忆化搜索:记dp[i] ...

  8. CF1038E Maximum Matching 搜索/区间DP

    题目传送门:http://codeforces.com/problemset/problem/1038/E 题意:给出$N$个方块,每个方块有左右两种颜色$a,b$(可以翻转使左右两种颜色交换)和一个 ...

  9. POJ-1088 滑雪 (记忆化搜索,dp)

    滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 86318 Accepted: 32289 Description Mich ...

随机推荐

  1. SQL Server 2008 安装指南

    一.安装需求: 1.硬件需求条件 硬件 需求 处理器 最低:1.4 GHz(x64处理器)注意:Windows Server 2008 for Itanium-Based Systems 版本需要In ...

  2. oracle在linux配置信息

    这两天在linux中给已有的oracle添加新实例,其中涉及数据库服务.监听配置,oracle服务是否正常.监听是否成功等操作,特此记录存档,以备后用. oracle服务启动操作命令 1.查看orac ...

  3. Apache MINA 框架之默认session管理类实现

    DefaultSocketSessionConfig 类 extends AbstractSocketSessionConfig extends AbstractIoSessionConfig imp ...

  4. Matlab使用xlsread, xlswrite函数导致excel进程无法终止的问题

    系统版本:Win7 64位 Matlab版本:R2015b 问题描述:使用excel的操作函数,比如xlsread,xlswrite,导致excel进程无法终止,任务管理器中仍残留excel进程,打开 ...

  5. Mysql表复制及备份还原

    1.复制表结构   1.1 含有主键等信息的完整表结构   CREATE table 新表名 LIKE book;     1.2 只有表结构,没有主键等信息   create table 新表名 s ...

  6. java Web Services搭建环境时遇到的各种问题,记录一下。 java.lang.OutOfMemoryError: PermGen space,org/apache/struts2/util/ObjectFactoryDestroyable

    情况:在同一个,myEclipes 下加载俩个项目,一个seriver端,一个client端. 必备: myEclipes    ,apache-tomcat-7.0.42,apache-tomcat ...

  7. iOS 集成支付宝遇到的问题(续)

    调起支付宝进行支付时提示private key is null ,碰到这个问题有两种解决方案 第一种. 将私钥转成PKCS8替换一下原私钥即可 1.生成私钥pem,  执行命令openssl genr ...

  8. 不用Google Adsense的84个赚钱方法

    这是一个关于网络广告商和网络销售的汇总列表,可以用来为您的网站或博客赚点钱.广告商都是英文的,加入广告请确认其是否支持中国地区支持,不支持的话就不必加入了. Chitika : 购物中心旗帜广告. ( ...

  9. java中的继承要点

    java的一大特性既是:继承. 1.因为有了一个子类继承了一个父类,才有了后面的多态. 2.类的继承,不要为了节省代码,为了继承而继承,把那个没有任何相关的类链接在一起,继承必须用在 is a,就是例 ...

  10. 第六篇、WebSphere8.5 (商业级服务器)大规模集群

    一.前言 上一篇中讲述了WebSphere的安装与应用,该版本的WAS一般都用于开发测试(有些小应用生产环境下也会用到),在生产中绝大部份使用的WebSphere Application Server ...