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 描述 小明是图书鹳狸猿,他有很多很多的书堆在了一起摆在了架子上,每摞书是横着放的,而且每摞书是订好的 是一个整体, ...
随机推荐
- JAVA GUI学习 - JInternalFrame浮动窗口:可拖拽窗口(依赖于父窗口)
public class JInternalFrameKnow extends JInternalFrame { public JInternalFrameKnow() { this.setBound ...
- Intersection(poj)
Intersection Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13140 Accepted: 3424 Des ...
- sql日期转换格式
Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE( ...
- Light OJ 1104 Birthday Pardo(生日悖论)
ime Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Description Sometime ...
- java int and string convert
int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.valueOf( ...
- linux shell awk 流程控制语句(if,for,while,do)详细介绍
在linux awk的 while.do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出.break中断当前正在执行的循环并跳到循环 ...
- 无法将类型“ASP.login_aspx”转换为“System.Web.UI.WebControls.Login”
今天碰上了一个很傻的问题,起码我认为是这样. 项目中首页名是:Login.aspx,编译.运行都没有出现问题. 于是打包发布网站,各项内容都配置好后,问题出现了.一运行首页面就出现下面这个错误: 编译 ...
- [置顶] PHP开发实战权威指南-读书总结
从今年开始,断断续续学习PHP已经有4个月了. 最初,认真学习PHP几天,就弄WordPress搭建了一个个人博客,这也符合技术人的实践理念. 最近,重温PHP开发实战权威指南,做点总结,整理下自己学 ...
- 1354 - IP Checking(水题)
1354 - IP Checking PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB An I ...
- Effective C++:条款37:绝不又一次定义继承而来的缺省參数值
因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数. (一) virtual函数是动态绑定 ...