题目链接: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. haproxy 超时自动重发

    timeout connect 5000 timeout client 50000 timeout server 50000 timeout check 5s stats refresh 30s Ap ...

  2. Microsoft SQL Server 混合云博客系列

    Microsoft 云操作系统愿景的核心支柱之一就是借助我们的混合云基础结构改造数据中心.在 Windows Azure 基础结构服务正式发布后的几个月里,我们一直在发布博客,介绍 Windows A ...

  3. MVC设计模式JavaWeb实现

    JSP开发模式 jsp开发模式的发展 1.模式1:(适合小型项目的技术的开发)     a.第一版本号.纯jsp(封装数据.处理数据,显示数据)     b.第二版本号,Jsp+JavaBean.   ...

  4. 面试之ajax原理(转载)

    总结1 总结2 AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术, 是几种原有技术的结合体. ...

  5. asp.net连接ORACLE数据库

    这段时间维护客户的一个系统,该系统使用的是ORACLE数据库,之前开发的时候用的都是MSSQL,并没有使用过ORACLE.这两种数据库虽然都是关系型数据库,但是具体的操作大有不同,这里作下记录. 连接 ...

  6. [译]Stairway to Integration Services Level 11 - 日志配置

    介绍 在前一个章节我们讨论了事先行为,分享了如何操作默认的行为和时间冒泡,并且介绍了父子模型. 本文中,我们会配置SSIS日志. 进行简单及高级日志配置,存储,和检索的实验.并且生成自定义日志信息. ...

  7. HtmlUnit+Jsoup 解决爬虫无法解析执行javascript的问题

    本人最近在研究爬虫.作为一个新手.研究了些爬虫框架,发现所有开源的爬虫框架很多,功能也很齐全,但唯独遗憾的是,目前还没有发现那个爬虫对js完美的解释并执行.看了浅谈网络爬虫爬js动态加载网页(二)之后 ...

  8. Oracle表解锁

    网搜 --第一步 查看被锁表 select b.owner,b.object_name, b.object_id,l.session_id,l.locked_mode from v$locked_ob ...

  9. UILabel显示html文本

    NSString * htmlString = @"<html><body> Some html string \n <font size=\"13\ ...

  10. 启动(Startup)

    Startup Chrome是一个单一的可执行程序.它清楚如何运行其它进程. 下面是chrome启动的概述: 1. 首先,chrome有一个平台相关的入口点:在windows上是wWinMain(): ...