/*

多谢了“闭眼,睁眼” 同学给我一套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之状图选最大矩形的更多相关文章

  1. HDU 1505 City Game(01矩阵 dp)

    Problem Description Bob is a strategy game programming specialist. In his new city building game the ...

  2. HDU 4352 XHXJ's LIS (数位DP,状压)

    题意: 前面3/4的英文都是废话.将一个正整数看成字符串,给定一个k,问区间[L,R]中严格的LIS=k的数有多少个? 思路: 实在没有想到字符0~9最多才10种,况且也符合O(nlogn)求LIS的 ...

  3. HDU 1505 City Game (hdu1506 dp二维加强版)

    F - City Game Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submi ...

  4. 树形DP+树状数组 HDU 5877 Weak Pair

    //树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...

  5. hdu 5025 Saving Tang Monk 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...

  6. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  7. 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 ...

  8. HDU 2457 DNA repair(AC自动机+DP)题解

    题意:给你几个模式串,问你主串最少改几个字符能够使主串不包含模式串 思路:从昨天中午开始研究,研究到现在终于看懂了.既然是多模匹配,我们是要用到AC自动机的.我们把主串放到AC自动机上跑,并保证不出现 ...

  9. 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 . ...

随机推荐

  1. [USACO2005 nov] Grazing on the Run【区间Dp】

    Online Judge:bzoj1742,bzoj1694 Label:区间Dp 题目描述 John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我 ...

  2. poj2407(欧拉函数模板)

    sqrt(n)复杂度 欧拉函数模板 #include <iostream> #include <cstdio> #include <queue> #include ...

  3. half adder vs. full adder

    1, half adder 2-input, 2-output input: A, B; output out, carry; 2, full adder 3-input, 2-output inpu ...

  4. MSSQLSERVER跨服务器连接(远程登录)的示例代码

    MSSQLSERVER跨服务器链接服务器创建方法如下 复制代码 代码如下: --声明变量 Declare @svrname varchar(255), @dbname varchar(255), @s ...

  5. 纯CSS样式写刘海屏效果

    1. 效果: 2. 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  6. privoxy 安装

    https://www.privoxy.org/sf-download-mirror/Sources/ 1.挑选源码版本,下载,解压 2.增加用户 useradd privoxy 3.make &am ...

  7. Cesium官方教程13--Cesium和Webpack

    原文地址:https://cesiumjs.org/tutorials/cesium-and-webpack/ Cesium 和 Webpack Webpack是非常强大非常流行的JavaScript ...

  8. re 模块 (正则的使用)

    一.正则表达式 英文全称: Regular Expression. 简称 regex或者re.正则表达式是对字符串操作的一种逻辑公式. 我们一般使用正则表达式对字符串进行匹配和过滤. 使用正则的优缺点 ...

  9. Undertow服务器基础分析 - XNIO

    阅读更多 我们从名字上就能看出这是一个NIO思想为基础的IO框架,X是指这个框架可以有多种实现,我们可以从代码库 https://github.com/xnio 中发现一个项目xnio-native, ...

  10. AutoMapper简介

    先说说DTO DTO是个什么东东? DTO(Data Transfer Object)就是数据传输对象,说白了就是一个对象,只不过里边全是数据而已. 为什么要用DTO? 1.DTO更注重数据,对领域对 ...