题目链接: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. libcurl的使用问题“Expect100-continue”

    最近在做团购酒店APP分享到qzone功能,使用libcurl访问qzone的分享cgi接口,酒店分享信息以POST方式传输,在测试的时候发现分享接口平均有2s的延迟,这延迟也太大了吧,于是乎问了空间 ...

  2. HDU 3584 Cube

    题目大意:给定一个体积为N*N*N立方体,每个单位小立方体A[x][y][z]里有一个值,初始值全部为0,我们可以对立方体进行一下两种操作: 0表示查询A[x][y][z]的奇偶性 1表示对子立方体的 ...

  3. 《数字图像处理原理与实践(MATLAB版)》一书之代码Part6

    本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part6,辑录该书第281至第374页之代码,供有须要读者下载研究使用.代码运行结果请參见原书配图,建议下载代码前阅读下 ...

  4. C# Best Practices - Accessing and Using Classes

    References and Using Do: Take care when defining references References must be one way (or circular ...

  5. 「OC」@property @synthesize和id

    一.@property @synthesize关键字 这两个关键字是编译器特性,让Xcode可以自动生成getter和setter. (一)@property 关键字 @property 关键字可以自 ...

  6. 杭电ACM 素数判定

    素数判定 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  7. Lake Counting(poj 2386)

    题目描述: Description Due to recent rains, water has pooled in various places in Farmer John's field, wh ...

  8. HTTPS的学习总结

    HTTPS学习总结 简述 HTTPS对比HTTP就多了一个安全层SSL/TLS,具体就是验证服务端的证书和对内容进行加密. 先来看看HTTP和HTTPS的区别 我用AFN访问http下的httpbin ...

  9. IE6不支持<a>标签以外元素的hover的解决方案

    IE6以及更低版本的浏览器对“:hover”的支持不理想,对于类似的“p:hover”.“img:hover”.“#header:hover”...,今天给大家介绍一种新的方法,可以完美解决IE6不支 ...

  10. ThinkPHP 3.1.2 控制器的模块和操作

    本节课大纲: 一.空模块和空操作 1.空操作 function _empty($name){ $this->show("$name 不存在 <a href='__APP__/In ...