hdu 1505 && hdu1506 &&hdu 2830 && 2870 总结---------DP之状图选最大矩形
/*
多谢了“闭眼,睁眼” 同学给我一套dp专题,不然真是没接触过这种题型。
做个4个简单的,很高兴有所收获。
2013-08-06
/*
HDU 1506
最基础的一道题目,其主要精髓就在于两个数组 l[i],r[i];
其中,l[i]用来存储第i个矩形的左边界,r[i]存储的是第i个矩形的右边界,也就是说对于任意的 l[i]<=x<=r[i]都有a[x]>=a[i] ;
#include<stdio.h>
#include<string.h>
#define Max(x,y) (x>y?x:y)
#define max 100000+10 typedef __int64 LL; LL a[max];
int l[max],r[max],n; int main(){
while(~scanf("%d",&n)&&n){
for(int i=;i<=n;i++){
scanf("%I64d",&a[i]);
l[i]=r[i]=i;
}
a[]=a[n+]=-;
LL ans=;
for(int i=;i<=n;i++){ //计算数组l
while(a[l[i]-]>=a[i]){
l[i]=l[l[i]-];
}
}
for(int i=n;i>=;i--){ //计算数据r
while(a[r[i]+]>=a[i]){
r[i]=r[r[i]+];
}
}
for(int i=;i<=n;i++){
ans=Max(ans,a[i]*(r[i]-l[i]+));
}
printf("%I64d\n",ans);
}
} ---------------------------------------------------------------------------- HDU #include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
#define Max(x,y) (x>y?x:y)
#define max 2000+10 int map[max][max];
int n,m,l[max/],r[max/];
int dp[max]; int DP(){
for(int i=;i<=m;i++){
l[i]=r[i]=i;
}
dp[]=dp[m+]=-;
for(int i=;i<=m;i++){
while(dp[l[i]-]>=dp[i]){
l[i]=l[l[i]-];
}
}
for(int i=m;i>=;i--){
while(dp[r[i]+]>=dp[i]){
r[i]=r[r[i]+];
}
}
int res=;
for(int i=;i<=n;i++){
res=Max(res,dp[i]*(r[i]-l[i]+));
}
return res;
} int main(){
int t;
scanf("%d",&t);
while(t--){
int ans=;
scanf("%d%d",&n,&m);
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++){
// getchar();
for(int j=;j<=m;j++){
char c[max];
scanf("%s",c);
if(c[]=='F'){
map[i][j]=;
dp[j]++;
}
else{
map[i][j]=;
dp[j]=;
}
}
ans=Max(ans,DP());
}
printf("%d\n",ans*);
}
}
===================================================================================
HDU #include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define Max(x,y) (x>y?x:y)
#define max 1000+5 char map[max][max];
int dp[max],temp[max],n,m; int DP(){
int res=;
memcpy(temp,dp,sizeof(dp));
sort(temp+,temp+m+);
for(int i=m;i>=;i--){
if(temp[i]){
res=Max(res,temp[i]*(m-i+));
}
}
return res;
} int main(){
while(~scanf("%d%d",&n,&m)){
int ans=;
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++){
scanf("%s",map[i]+);
for(int j=;j<=m;j++){
if(map[i][j]==''){
dp[j]++;
}
else{
dp[j]=;
}
}
ans=Max(ans,DP());
}
printf("%d\n",ans);
}
} ================================================================================= HDU #include<stdio.h>
#include<string.h>
#define Max(x,y) (x>y?x:y)
#define max 1000+5 int n,m,dp[max],l[max],r[max];
char map[max][max],temp[max][max]; void change(char a,char b,char c,char d){
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
temp[i][j]=map[i][j];
char& t=temp[i][j];
if(t==b||t==c||t==d){
t=a;
}
}
}
} int work(){
for(int i=;i<=m;i++){
l[i]=r[i]=i;
}
dp[]=dp[m+]=-;
for(int i=;i<=m;i++){
while(dp[l[i]-]>=dp[i]){
l[i]=l[l[i]-];
}
}
for(int i=m;i>=;i--){
while(dp[r[i]+]>=dp[i]){
r[i]=r[r[i]+];
}
}
int ans=;
for(int i=;i<=m;i++){
ans=Max(ans,dp[i]*(r[i]-l[i]+));
}
return ans;
} int DP(char c){
int ans=;
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(temp[i][j]==c){
dp[j]++;
}
else{
dp[j]=;
}
}
ans=Max(ans,work());
}
return ans;
} int solve(){
int ans=;
change('a','w','y','z');
ans=Max(ans,DP('a'));
change('b','w','x','z');
ans=Max(ans,DP('b'));
change('c','x','y','z');
ans=Max(ans,DP('c'));
return ans;
} int main(){
while(~scanf("%d%d",&n,&m)){
for(int i=;i<=n;i++){
getchar();
for(int j=;j<=m;j++){
scanf("%c",&map[i][j]);
}
}
int ans=solve();
printf("%d\n",ans);
}
}
hdu 1505 && hdu1506 &&hdu 2830 && 2870 总结---------DP之状图选最大矩形的更多相关文章
- HDU 1505 City Game(01矩阵 dp)
Problem Description Bob is a strategy game programming specialist. In his new city building game the ...
- HDU 4352 XHXJ's LIS (数位DP,状压)
题意: 前面3/4的英文都是废话.将一个正整数看成字符串,给定一个k,问区间[L,R]中严格的LIS=k的数有多少个? 思路: 实在没有想到字符0~9最多才10种,况且也符合O(nlogn)求LIS的 ...
- HDU 1505 City Game (hdu1506 dp二维加强版)
F - City Game Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submi ...
- 树形DP+树状数组 HDU 5877 Weak Pair
//树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...
- hdu 5025 Saving Tang Monk 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 3341 Lost's revenge AC自动机+dp
Lost's revenge Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)T ...
- HDU 2457 DNA repair(AC自动机+DP)题解
题意:给你几个模式串,问你主串最少改几个字符能够使主串不包含模式串 思路:从昨天中午开始研究,研究到现在终于看懂了.既然是多模匹配,我们是要用到AC自动机的.我们把主串放到AC自动机上跑,并保证不出现 ...
- HDU 1028 Ignatius and the Princess III dp整数划分
http://acm.hdu.edu.cn/showproblem.php?pid=1028 dp[i][j]表示数值为i,然后最小拆分的那个数是j的时候的总和. 1 = 1 2 = 1 + 1 . ...
随机推荐
- 深入理解Java虚拟机(类文件结构)
深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_P ...
- HTML值改变事件
1.动态拼接html[表格中,如bootstrap grid] return '<input type="text" name="bjce" onchan ...
- MySQL操作表和表记录
目录 操作表 增 列约束 列类型 删 改 修改表名 增加字段 修改字段 删除字段 查 复制表结构 操作表数据 增 删 改 查 操作表 增 创建表语法 创建一个表,多个字段: create table ...
- html 引入公共的头部和底部
- linux和window环境下安装ruby和sass
linux下安装ruby 下载linux的ruby安装包 http://www.ruby-lang.org/en/downloads/ 将ruby安装包在linux环境下解压 tar -x ...
- js获取网页屏高 屏宽
<SCRIPT LANGUAGE="JavaScript"> <!-- //document.body.scrollTop 滚动条的上端距离 //document ...
- 图数据库neo4j和关系数据库的区别
相信您和我一样,在使用关系型数据库时常常会遇到一系列非常复杂的设计问题.例如一部电影中的各个演员常常有主角配角之分,还要有导演,特效等人员的参与.通常情况下这些人员常常都被抽象为Person类型,对应 ...
- MVVM基础概念和理解
在MVVM模式中,View封装UI和UI逻辑,viewmodel封装presentation逻辑,model封装业务逻辑和数据. View类 View的责任是定义屏幕上的结构和外观,在完美的情况下,v ...
- JS实用插件
1. jQuery鼠标滚轮事件插件Mouse Wheel 下载链接:https://github.com/brandonaaron/jquery-mousewheel/ 使用方法: // using ...
- deepfake安装python常用命令
pip install -r requirements.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/ python -m p ...