CF(435D - Special Grid)dp
题目链接: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的更多相关文章
- Codeforces Round #249 (Div. 2) D. Special Grid 枚举
题目链接: http://codeforces.com/contest/435/problem/D D. Special Grid time limit per test:4 secondsmemor ...
- 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 ...
- CF 256D. Good Sequences(DP)
题目链接 主要是标记前面素数的最大的DP值,要认真一些.没想到居然写了一个很难发现的错误. #include <cstdio> #include <cstring> #incl ...
- CF 335B - Palindrome 区间DP
335B - Palindrome 题目: 给出一个字符串(均有小写字母组成),如果有长度为100的回文子串,输出该子串.否则输出最长的回文子串. 分析: 虽然输入串的长度比较长,但是如果存在单个字母 ...
- CF 518D(概率dp)
传送门:Ilya and Escalator 题意:有n个人排队进车厢,每秒只能进一个人,而且第1个人进了后面的人才能进,第一个人每秒进入车厢的概率为p,不进的概率为1-p,求t秒后进入车厢总人数的数 ...
- 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 ...
- CF(D. Fibonacci Sums)dp计数
题目链接:http://codeforces.com/contest/126/problem/D 题意:一个数能够有多种由互不同样的斐波那契数组成的情况: 解法:dp,easy证明:每一个数通过贪心能 ...
- CF C. Three displays(DP+思维)
http://codeforces.com/contest/987/problem/C 题意:给你两个n的序列要你根据第一个序列(严格单调递增的方式)在第二个序列里找3个数加起来,输出最小的一个. 思 ...
- nyoj 1216——整理图书 CF 229D—— Towers——————【dp+贪心】
整理图书 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 小明是图书鹳狸猿,他有很多很多的书堆在了一起摆在了架子上,每摞书是横着放的,而且每摞书是订好的 是一个整体, ...
随机推荐
- Ntop监控网络流量
运用Ntop监控网络流量 ____ 网络流量反映了网络的运行状态,是判别网络运行是否正常的关键数据,在实际的网络中,如果对网络流量控制得不好或发生网络拥塞,将会导致网络吞吐量下降. 网络性能降低.通过 ...
- IPTABLES 映射问题
今天要做一个新的映射:将内网的一个8090口映射到外网的8087口. 在 /ETC/RC.LOCAL中最后插入: iptables -t nat -A PREROUTING -d outIP -p t ...
- Palindrome(Manacher)
Palindrome Time Limit: 15000MS Memory Limit: 65536K Total Submissions: 6183 Accepted: 2270 Descr ...
- 简单的REST的框架实现
源代码下载地址:http://download.csdn.net/source/1662193 一. 认识REST REST软件架构是由Roy Thomas Fielding博士在2000年首次提出的 ...
- Android Blur效果之FastBlur
Blur 自从iOS系统引入了Blur效果,也就是所谓的毛玻璃.模糊化效果,磨砂效果,各大系统就開始竞相模仿,这是一个怎样的效果呢,我们现来看一些图: 这些就是典型的Blur效果,在iOS和MIUI中 ...
- jQuery也能舞出绚丽的界面(完结篇)
ThematicMap又增加了两种Chart类型,现在总算是齐全了,效果也出来了,与大家分享一下: 1.MultiSelect选择界面: 颜色框是可以选择颜色的: 2.生成的饼图效果: 3.生成的柱状 ...
- windows下C语言调用系统文件选择对话框
代码片段,在windows下用C语言调用文件选择对话框,以备忘 #define DEFAULT_DIR "" char extraction_path[MAX_PATH] = DE ...
- java线程之停止线程
在Java中有以下3种方法可以终止一个正在运行的线程: 1.使用退出标志,是线程正常退出,也就是run方法完成后线程终止. 2.使用stop方法强制终止线程,但不推荐使用 ...
- javascripts小结
1 NAN-isNaN():判断是否数值 2 数值转换 Number()-任何数据类型,parseInt(),parseFloat()-字符串 3数组转字符串 var a=["red&quo ...
- Node.js学习笔记2(安装和配置Node.js)
1.安装 windows下安装,在http://nodejs.org下载安装包进行安装即可. linux下安装,使用yum或者下载源码进行编译. ...