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 . ...
随机推荐
- T3118 01完美矩阵【计数,前缀和,差分,好题】
Online Judge:未知 Label:好题,计数,前缀和 题目描述 一个01矩形被称为是完美01矩形,如果满足下面3个条件: (1)它的四条边上都是1 (2)内部(除了4条边)的0和1的个数之差 ...
- web.xml中多个Servlet执行顺序的问题!
1.两个servlet或者两个servlet-mapping,其中的servlet-name名称不能存在相同. 2.所有的servlet-mapping标签下,url-pattern中包含的文本不能相 ...
- Taro踩坑记录一: swiper组件pagestate定制,swiperChange中setState导致组件不能滚动。
import Taro, { Component } from '@tarojs/taro'; import { Swiper, SwiperItem, Image, View } from '@ta ...
- localStorage,sessionStorage,cookie区别
localStorage:HTML5新增的在浏览器端存储数据的方法.设置和获取localStorage的方法: 设置: localStorage.name = 'zjj'; 获取: localStor ...
- coreseek 基与Sphinx 的全文索引
假设有两张那个表,分别为articles,article_photos两张表.搜索的时候,要匹配articles.title.articles.intro.article_photos.caption ...
- php中date() 函数
实例 格式化本地日期和时间,并返回格式化的日期字符串: <?php // Prints the day echo date("l") . "<br>&q ...
- 最后的egret
坚持做一件事真的好难~ 决定重新写博客的时候想着一定要坚持一个周一篇,然而.... 年后上班老板找我的第一件大事:以后公司的棋牌产品不会有大的动作了:公司PHP(内部用的运营后台)的小姐姐休产假了,我 ...
- System.Web.Mvc.FileContentResult.cs
ylbtech-System.Web.Mvc.FileContentResult.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, ...
- PAT甲级——A1095 Cars on Campus
Zhejiang University has 8 campuses and a lot of gates. From each gate we can collect the in/out time ...
- sip会话流程以及sip介绍(2)
下面我们通过一个简单的场景例子来简单介绍一下 SIP 会话流程. Tom 和 Jerry 是非常好的伙伴,Tom 在他的 PC 上使用一个 SIP 的应用程序呼叫 Internet 上另一个 SIP ...