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 . ...
随机推荐
- 【默默努力】ig-wxz-and-hotdog
这个是一个非常跟热点的小游戏,思聪吃热狗.这个游戏的话,我感觉思路还挺简单的,天上会掉热狗和障碍物, 思聪在下面张开嘴巴,进行左右移动,接热狗.如果吃到的是热狗就得一分,如果思聪吃到的不是热狗,是障碍 ...
- jdk11.0.2安装
1.去官网下载合适的jdk 网址:https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.ht ...
- 2017.1.16【初中部 】普及组模拟赛C组总结
2017.1.16[初中部 ]普及组模拟赛C组 这次总结我赶时间,不写这么详细了. 话说这次比赛,我虽然翻了个大车,但一天之内AK,我感到很高兴 比赛 0+15+0+100=115 改题 AK 一.c ...
- 连通图,set——cf1037E
看了题解又调了很久,用set来维护当前满足条件的pair<degree[v],v> 离线操作,先建好一张图,然后建立好集合,每次删边后都把集合里不满足条件的点删去,同时更新集合 /* 离线 ...
- ubuntu 环境变量修改和恢复总结
通常设置环境变量有三种方法: 一.临时设置export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-amd64export PATH=$JAVA_HOME/:$ ...
- threading.local在flask中的用法
一.介绍 threading.local的作用: 多个线程修改同一个数据,复制多份变量给每个线程用,为每个线程开辟一块空间进行数据的存储,而每块空间内的数据也不会错乱. 二.不使用threading. ...
- js摇一摇事件
今早同事过来说.要做个小游戏.里面有个摇一摇动作. 平时都是做的手机营销h5比较少. 发现很有意思. 一时间没有反应过来. 怎么实现的摇一摇. 现在吧代码叠出来给2货的我. //运动事件监听if ...
- redis深入学习(一)-----CAP、redis数据类型
NoSQL数据库的四大分类 KV键值: memcache+redis 文档型数据库(bson格式比较多): MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在 ...
- vue 五星评价插件
html: <div class="starBox" ref="star1"> <div class="star" v-f ...
- cesium-长度测量和面积测量
网上找的大神的实现方法有点问题,实现有一些bug,作为cesium新手一个,弃之不忍,只好硬着头皮修改了,不过还好问题不大,再次mark一下,下次就可以直接用了 image.png import ...