题目链接:http://codeforces.com/problemset/problem/435/D

题意:求三角形个数,三个点必须的白点上,而且三条边必须是横线,竖线或对角线,三条边上不同意出现黑点。

解法:dp,计算以每一个点为三角形左下角的个数,当中共同拥有8种形状。为了O(1)查询某段横线竖线和对角线是否有黑点,须要预处理各个方向的黑点数量;

代码:

  1. /******************************************************
  2. * @author:xiefubao
  3. *******************************************************/
  4. #pragma comment(linker, "/STACK:102400000,102400000")
  5. #include <iostream>
  6. #include <cstring>
  7. #include <cstdlib>
  8. #include <cstdio>
  9. #include <queue>
  10. #include <vector>
  11. #include <algorithm>
  12. #include <cmath>
  13. #include <map>
  14. #include <set>
  15. #include <stack>
  16. #include <string.h>
  17. //freopen ("in.txt" , "r" , stdin);
  18. using namespace std;
  19.  
  20. #define eps 1e-8
  21. #define zero(_) (abs(_)<=eps)
  22. const double pi=acos(-1.0);
  23. typedef long long LL;
  24. const int Max=100010;
  25. const int INF=1e9+7;
  26.  
  27. LL ans=0;
  28. char s[410][410];
  29. int heng[410][410];
  30. int shu[410][410];
  31. int xie1[410][410];
  32. int xie2[410][410];
  33. int n,m;
  34. bool OK1(int i,int j,int k)
  35. {
  36. return xie2[i][j]-xie2[i-k][j+k]==0;
  37. }
  38. bool OK2(int i,int j,int k)
  39. {
  40. return heng[i][j+k]-heng[i][j]==0;
  41. }
  42. bool OK3(int i,int j,int k)
  43. {
  44. return xie1[i][j]-xie1[i-k][j-k]==0;
  45. }
  46. bool OK4(int i,int j,int k)
  47. {
  48. return shu[i][j]-shu[i-k][j]==0;
  49. }
  50. bool OK(int i,int j)
  51. {
  52. return i>=0&&i<n&&j>=0&&j<m;
  53. }
  54. int main()
  55. {
  56. cin>>n>>m;
  57. for(int i=0; i<n; i++)
  58. scanf("%s",s[i]);
  59. for(int i=0; i<n; i++)
  60. {
  61. heng[i][0]=(s[i][0]=='1');
  62. for(int j=1; j<m; j++)
  63. heng[i][j]=heng[i][j-1]+(s[i][j]=='1');
  64. }
  65. for(int i=0; i<m; i++)
  66. {
  67. shu[0][i]=(s[0][i]=='1');
  68. for(int j=1; j<n; j++)
  69. shu[j][i]=shu[j-1][i]+(s[j][i]=='1');
  70. }
  71. for(int i=0; i<n; i++)
  72. {
  73. for(int j=0; j<m; j++)
  74. {
  75. xie1[i][j]=(s[i][j]=='1');
  76. if(OK(i-1,j-1))
  77. xie1[i][j]+=xie1[i-1][j-1];
  78. }
  79. }
  80. for(int i=0; i<n; i++)
  81. {
  82. for(int j=0; j<m; j++)
  83. {
  84. xie2[i][j]=(s[i][j]=='1');
  85. if(OK(i-1,j+1))
  86. xie2[i][j]+=xie2[i-1][j+1];
  87. }
  88. }
  89. for(int i=0; i<n; i++)
  90. for(int j=0; j<m; j++)
  91. {
  92. if(s[i][j]=='1') continue;
  93. for(int k=1; k<=min(i,j); k++)
  94. {
  95. if(s[i][j-k]=='0'&&s[i-k][j]=='0'&&OK1(i,j-k,k))
  96. ans++;
  97. if(s[i][j-k]=='1'||s[i-k][j]=='1')
  98. break;
  99. }
  100. }
  101. //cout<<ans<<endl;
  102. for(int i=0; i<n; i++)
  103. for(int j=0; j<m; j++)
  104. {
  105. if(s[i][j]=='1') continue;
  106. for(int k=1; k<=min(i,j); k++)
  107. {
  108. if(s[i][j-k]=='0'&&s[i-k][j-k]=='0'&&OK4(i,j-k,k))
  109. ans++;
  110. if(s[i][j-k]=='1'||s[i-k][j-k]=='1')
  111. break;
  112. }
  113. }
  114. for(int i=0; i<n; i++)
  115. for(int j=0; j<m; j++)
  116. {
  117. if(s[i][j]=='1') continue;
  118. for(int k=1; k<=min(i,j); k++)
  119. {
  120. if(s[i-k][j]=='0'&&s[i-k][j-k]=='0'&&OK2(i-k,j-k,k))
  121. ans++;
  122. if(s[i-k][j]=='1'||s[i-k][j-k]=='1')
  123. break;
  124. }
  125. }
  126. //cout<<ans<<endl;
  127. for(int i=0; i<n; i++)
  128. for(int j=0; j<m; j++)
  129. {
  130. if(s[i][j]=='1') continue;
  131. for(int k=1; k<=min(i,m-j-1); k++)
  132. {
  133. if(s[i-k][j]=='0'&&s[i-k][j+k]=='0'&&OK2(i-k,j,k))
  134. ans++;
  135. if(s[i-k][j]=='1'||s[i-k][j+k]=='1')
  136. break;
  137. }
  138. }
  139. //cout<<ans<<endl;
  140. for(int i=0; i<n; i++)
  141. for(int j=0; j<m; j++)
  142. {
  143. if(s[i][j]=='1') continue;
  144. for(int k=1; k<=min(j,min(i,m-j-1)); k++)
  145. {
  146. if(s[i-k][j-k]=='0'&&s[i-k][j+k]=='0'&&OK2(i-k,j-k,2*k))
  147. ans++;
  148. if(s[i-k][j-k]=='1'||s[i-k][j+k]=='1')
  149. break;
  150. }
  151. }
  152. //cout<<ans<<endl;
  153. for(int i=0; i<n; i++)
  154. for(int j=0; j<m; j++)
  155. {
  156. if(s[i][j]=='1') continue;
  157. for(int k=1; k<=j&&2*k<=i; k++)
  158. {
  159. if(s[i-k][j-k]=='0'&&s[i-2*k][j]=='0'&&s[i-2*k+1][j]=='0'&&OK1(i-k,j-k,k))
  160. ans++;
  161. if(s[i-k][j-k]=='1'||s[i-2*k][j]=='1'||s[i-2*k+1][j]=='1')
  162. break;
  163. }
  164. }
  165. //cout<<ans<<endl;
  166. for(int i=0; i<n; i++)
  167. for(int j=0; j<m; j++)
  168. {
  169. if(s[i][j]=='1') continue;
  170. for(int k=1; k<=m-1-j&&2*k<=i; k++)
  171. {
  172. if(s[i-k][j+k]=='0'&&s[i-2*k][j]=='0'&&s[i-2*k+1][j]=='0'&&OK3(i-k,j+k,k))
  173. ans++;
  174. if(s[i-k][j+k]=='1'||s[i-2*k][j]=='1'||s[i-2*k+1][j]=='1')
  175. break;
  176. }
  177. }
  178. for(int i=0; i<n; i++)
  179. for(int j=0; j<m; j++)
  180. {
  181. if(s[i][j]=='1') continue;
  182. for(int k=1; k<=j&&2*k<=j; k++)
  183. {
  184. if(s[i][j-2*k]=='0'&&s[i][j-2*k+1]=='0'&&s[i-k][j-k]=='0'&&OK1(i,j-2*k,k))
  185. ans++;
  186. if(s[i][j-2*k]=='1'||s[i][j-2*k+1]=='1'||s[i-k][j-k]=='1')
  187. break;
  188. }
  189. }
  190. cout<<ans<<endl;
  191. return 0;
  192. }

CF(435D - Special Grid)dp的更多相关文章

  1. Codeforces Round #249 (Div. 2) D. Special Grid 枚举

    题目链接: http://codeforces.com/contest/435/problem/D D. Special Grid time limit per test:4 secondsmemor ...

  2. Codeforces Round #589 (Div. 2) E. Another Filling the Grid(DP, 组合数学)

    链接: https://codeforces.com/contest/1228/problem/E 题意: You have n×n square grid and an integer k. Put ...

  3. CF 256D. Good Sequences(DP)

    题目链接 主要是标记前面素数的最大的DP值,要认真一些.没想到居然写了一个很难发现的错误. #include <cstdio> #include <cstring> #incl ...

  4. CF 335B - Palindrome 区间DP

    335B - Palindrome 题目: 给出一个字符串(均有小写字母组成),如果有长度为100的回文子串,输出该子串.否则输出最长的回文子串. 分析: 虽然输入串的长度比较长,但是如果存在单个字母 ...

  5. CF 518D(概率dp)

    传送门:Ilya and Escalator 题意:有n个人排队进车厢,每秒只能进一个人,而且第1个人进了后面的人才能进,第一个人每秒进入车厢的概率为p,不进的概率为1-p,求t秒后进入车厢总人数的数 ...

  6. CF 225C Barcode(DP)

    传送门:点我 You've got an n × m pixel picture. Each pixel can be white or black. Your task is to change t ...

  7. CF(D. Fibonacci Sums)dp计数

    题目链接:http://codeforces.com/contest/126/problem/D 题意:一个数能够有多种由互不同样的斐波那契数组成的情况: 解法:dp,easy证明:每一个数通过贪心能 ...

  8. CF C. Three displays(DP+思维)

    http://codeforces.com/contest/987/problem/C 题意:给你两个n的序列要你根据第一个序列(严格单调递增的方式)在第二个序列里找3个数加起来,输出最小的一个. 思 ...

  9. nyoj 1216——整理图书 CF 229D—— Towers——————【dp+贪心】

    整理图书 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 小明是图书鹳狸猿,他有很多很多的书堆在了一起摆在了架子上,每摞书是横着放的,而且每摞书是订好的 是一个整体, ...

随机推荐

  1. JAVA GUI学习 - JInternalFrame浮动窗口:可拖拽窗口(依赖于父窗口)

    public class JInternalFrameKnow extends JInternalFrame { public JInternalFrameKnow() { this.setBound ...

  2. Intersection(poj)

    Intersection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13140   Accepted: 3424 Des ...

  3. sql日期转换格式

    Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE( ...

  4. Light OJ 1104 Birthday Pardo(生日悖论)

    ime Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu   Description Sometime ...

  5. java int and string convert

    int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.valueOf( ...

  6. linux shell awk 流程控制语句(if,for,while,do)详细介绍

    在linux awk的 while.do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出.break中断当前正在执行的循环并跳到循环 ...

  7. 无法将类型“ASP.login_aspx”转换为“System.Web.UI.WebControls.Login”

    今天碰上了一个很傻的问题,起码我认为是这样. 项目中首页名是:Login.aspx,编译.运行都没有出现问题. 于是打包发布网站,各项内容都配置好后,问题出现了.一运行首页面就出现下面这个错误: 编译 ...

  8. [置顶] PHP开发实战权威指南-读书总结

    从今年开始,断断续续学习PHP已经有4个月了. 最初,认真学习PHP几天,就弄WordPress搭建了一个个人博客,这也符合技术人的实践理念. 最近,重温PHP开发实战权威指南,做点总结,整理下自己学 ...

  9. 1354 - IP Checking(水题)

    1354 - IP Checking   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB An I ...

  10. Effective C++:条款37:绝不又一次定义继承而来的缺省參数值

    因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数. (一) virtual函数是动态绑定 ...