usaco Home on the Range(dp+容斥原理)
2015-09-24 19:46
393 查看
给一个二维的01矩阵,求边长为N,面积为N*N的正方形的个数,可以重合。
直接利用dp在数组sum[i][j]中存储下标从1-i,1-j的矩形的面积,然后枚举边长,和左上角的点统计就行了。
直接利用dp在数组sum[i][j]中存储下标从1-i,1-j的矩形的面积,然后枚举边长,和左上角的点统计就行了。
/* ID: modengd1 PROG: range LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> using namespace std; int sum[251][251]; int N; int ans[251]; int main() { freopen("range.in","r",stdin); freopen("range.out","w",stdout); char ch; scanf("%d",&N); getchar(); memset(sum,0,sizeof(sum)); memset(ans,0,sizeof(ans)); for(int i=1;i<=N;i++) { for(int j=1;j<=N;j++) { scanf("%c",&ch); sum[i][j]=sum[i-1][j]+sum[i][j-1]+(int)(ch-'0')-sum[i-1][j-1]; } getchar(); } for(int k=2;k<=N;k++) { for(int i=1;i<=N-k+1;i++) { for(int j=1;j<=N-k+1;j++) { int area1=sum[i+k-1][j+k-1]; int area2=sum[i+k-1][j-1]; int area3=sum[i-1][j+k-1]; int area4=sum[i-1][j-1]; int area5=area1-area2-area3+area4; if(area5==k*k) ans[k]++; } } } for(int i=2;i<=N;i++) { if(ans[i]!=0) cout<<i<<' '<<ans[i]<<endl; } return 0; }
相关文章推荐
- PAT(甲级)1026
- 自增运算符
- Mac技术预览之<1>关于为Mac开发应用
- 杭电2112-HDU Today(最短路)
- 白话经典算法系列之九 从归并排序到数列的逆序数对(微软笔试题)
- 普通的增删改查list View与LinQ:集成化语言增删改查与扩展属性
- ACM学习历程—Hihocoder 1233 Boxes(bfs)(2015北京网赛)
- 自增运算符
- 关于JAVA 类加载器的研究
- Codeforces Round #321 (Div. 2) 580C Kefa and Park(dfs)
- 线程池ThreadPoolExecutor使用简介
- 查看oracle当前连接数(转)
- 任务管理器的实现及源码
- mysql 获取自增id的值的方法
- Java集合框架中List接口的简单使用
- 第二章 证券投资基金概述
- Httpsqs类。
- PAT(甲级)1025
- linux mysql 命令
- android四大组件详解