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

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

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

代码:

/******************************************************
* @author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std; #define eps 1e-8
#define zero(_) (abs(_)<=eps)
const double pi=acos(-1.0);
typedef long long LL;
const int Max=100010;
const int INF=1e9+7; LL ans=0;
char s[410][410];
int heng[410][410];
int shu[410][410];
int xie1[410][410];
int xie2[410][410];
int n,m;
bool OK1(int i,int j,int k)
{
return xie2[i][j]-xie2[i-k][j+k]==0;
}
bool OK2(int i,int j,int k)
{
return heng[i][j+k]-heng[i][j]==0;
}
bool OK3(int i,int j,int k)
{
return xie1[i][j]-xie1[i-k][j-k]==0;
}
bool OK4(int i,int j,int k)
{
return shu[i][j]-shu[i-k][j]==0;
}
bool OK(int i,int j)
{
return i>=0&&i<n&&j>=0&&j<m;
}
int main()
{
cin>>n>>m;
for(int i=0; i<n; i++)
scanf("%s",s[i]);
for(int i=0; i<n; i++)
{
heng[i][0]=(s[i][0]=='1');
for(int j=1; j<m; j++)
heng[i][j]=heng[i][j-1]+(s[i][j]=='1');
}
for(int i=0; i<m; i++)
{
shu[0][i]=(s[0][i]=='1');
for(int j=1; j<n; j++)
shu[j][i]=shu[j-1][i]+(s[j][i]=='1');
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
xie1[i][j]=(s[i][j]=='1');
if(OK(i-1,j-1))
xie1[i][j]+=xie1[i-1][j-1];
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
xie2[i][j]=(s[i][j]=='1');
if(OK(i-1,j+1))
xie2[i][j]+=xie2[i-1][j+1];
}
}
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(s[i][j]=='1') continue;
for(int k=1; k<=min(i,j); k++)
{
if(s[i][j-k]=='0'&&s[i-k][j]=='0'&&OK1(i,j-k,k))
ans++;
if(s[i][j-k]=='1'||s[i-k][j]=='1')
break;
}
}
//cout<<ans<<endl;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(s[i][j]=='1') continue;
for(int k=1; k<=min(i,j); k++)
{
if(s[i][j-k]=='0'&&s[i-k][j-k]=='0'&&OK4(i,j-k,k))
ans++;
if(s[i][j-k]=='1'||s[i-k][j-k]=='1')
break;
}
}
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(s[i][j]=='1') continue;
for(int k=1; k<=min(i,j); k++)
{
if(s[i-k][j]=='0'&&s[i-k][j-k]=='0'&&OK2(i-k,j-k,k))
ans++;
if(s[i-k][j]=='1'||s[i-k][j-k]=='1')
break;
}
}
//cout<<ans<<endl;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(s[i][j]=='1') continue;
for(int k=1; k<=min(i,m-j-1); k++)
{
if(s[i-k][j]=='0'&&s[i-k][j+k]=='0'&&OK2(i-k,j,k))
ans++;
if(s[i-k][j]=='1'||s[i-k][j+k]=='1')
break;
}
}
//cout<<ans<<endl;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(s[i][j]=='1') continue;
for(int k=1; k<=min(j,min(i,m-j-1)); k++)
{
if(s[i-k][j-k]=='0'&&s[i-k][j+k]=='0'&&OK2(i-k,j-k,2*k))
ans++;
if(s[i-k][j-k]=='1'||s[i-k][j+k]=='1')
break;
}
}
//cout<<ans<<endl;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(s[i][j]=='1') continue;
for(int k=1; k<=j&&2*k<=i; k++)
{
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))
ans++;
if(s[i-k][j-k]=='1'||s[i-2*k][j]=='1'||s[i-2*k+1][j]=='1')
break;
}
}
//cout<<ans<<endl;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(s[i][j]=='1') continue;
for(int k=1; k<=m-1-j&&2*k<=i; k++)
{
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))
ans++;
if(s[i-k][j+k]=='1'||s[i-2*k][j]=='1'||s[i-2*k+1][j]=='1')
break;
}
}
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
if(s[i][j]=='1') continue;
for(int k=1; k<=j&&2*k<=j; k++)
{
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))
ans++;
if(s[i][j-2*k]=='1'||s[i][j-2*k+1]=='1'||s[i-k][j-k]=='1')
break;
}
}
cout<<ans<<endl;
return 0;
}

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. IOS文件沙盒

    在进行IPhone开发的时候,常常需要将简单的数据保存到文件中,以便下次再重新打开的时候能够读取文件中保存的数据. 下面就来做一个简单的demo: 步骤: 1.创建一个SingleView项目,带有x ...

  2. Maven导入时,Cannot change version of project facet Dynamic Web Module to 3.0.

    今天手贱,在eclipse里面把项目删掉了,重新maven导入时,报出Cannot change version of project facet Dynamic Web Module to 3.0. ...

  3. if语句之猜拳

    用计算机来生成随机数: Random rand = new Random();//做一个随机生成器,Random();后面的括号里面可以放一个随机生成器种子,这个种子只能为整数(int)int n = ...

  4. BZOJ 1718: [Usaco2006 Jan] Redundant Paths 分离的路径( tarjan )

    tarjan求边双连通分量, 然后就是一棵树了, 可以各种乱搞... ----------------------------------------------------------------- ...

  5. poj 3335 /poj 3130/ poj 1474 半平面交 判断核是否存在 / poj1279 半平面交 求核的面积

    /*************** poj 3335 点序顺时针 ***************/ #include <iostream> #include <cmath> #i ...

  6. hibernate 数据关联一对一 3.2

    第一种一对一 person和card,card的id即作为主键,又作为外键  // 各村对方的一个对象 public class Person { private Integer id; privat ...

  7. hibernate 持久化对象的生命周期 2.1

    持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...

  8. Uva 552 Prime Ring Problem(dfs)

    题目链接:Uva 552 思路分析:时间限制为3s,数据较小,使用深度搜索查找所有的解. 代码如下: #include <iostream> #include <string.h&g ...

  9. php调用com组件配置 以openoffice为例

    什么是com组件? COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统.COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件 ...

  10. 写了交互给后台后来不能用?bug多多多又找不到文件效率低?工作流程帮你优化起来~~~~

    前端工作流程(多方交互篇) 新的网页: 1.跟美工沟通,跟产品沟通,跟后台沟通.前两者主要是页面样式.后者主要是表单交互.用哪个框架之类的. 2.实现.(写清楚哪块是用什么验证方式的)→ 给后台. 3 ...