/*

多谢了“闭眼,睁眼” 同学给我一套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. 【学术篇】luogu2184贪婪大陆

    题目在这里哦, 戳一下就可以了~ 题目大意: 支持两种操作,区间添加一种新元素,查询区间颜色种数.. 题目标签是线段树啊,我也本来想写一个线段树,后来写不出来……(我太弱了orz) 然后就草率地看了看 ...

  2. 【JZOJ2679】跨时代

    description 钟逆时针而绕,恶物狰狞的倾巢,我谦卑安静地于城堡下的晚祷,压抑远古流窜的蛮荒暗号,而管风琴键高傲的说,那只是在徒劳.我的乐器在环绕,时代无法淘汰我霸气的皇朝. 你无法预言,因为 ...

  3. 如何做一个标记为安全的ACTIVEX控件

    1.添加辅助函数控件的基本结构中含有xxApp,xxCtrl,xxPropPage三个类.找到xxApp的头文件,添加三个辅助函数.// Helper functionto create a comp ...

  4. BZOJ 1579 [Usaco2009 Feb]Revamping Trails 道路升级

    堆优化的dijkstra. 把一个点拆成k个. 日常空间要开炸一次.. //Twenty #include<cstdio> #include<cstring> #include ...

  5. 深入浅出 Java Concurrency (29): 线程池 part 2 Executor 以及Executors[转]

    Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具.真正的线程池接口是ExecutorService. 下面这张图完整描述了线程 ...

  6. sql自定义日期函数,返回范围内日期和星期数表。

    Create function [dbo].[FUN_GenerateTime] ( @begin_date datetime, -- 起始时间 @end_date datetime -- 结束时间 ...

  7. Python学习day11-函数基础(1)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  8. MySQL Server Logs

    日志记录存储方式 #日志记录存储方式 mysql> show variables like 'log_output'; mysql> set global log_output='FILE ...

  9. svn插件的所有链接

    http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240

  10. 第一个简单netty程序

    一个简单的netty的程序,主要是netty的客户端和服务端通信. 大部分说明都写在代码注释中 netty server TimeServer import io.netty.bootstrap.Se ...