zoukankan      html  css  js  c++  java
  • HDU 1505 Largest Rectangle in a Histogram && HDU 1506 City Game(动态规划)



    1506意甲冠军:给你一个连续的直方图(拼贴底部长度1)。求连续基质区。




    对每一个直方图,分别向左向右进行扩展。


    #include<cstdio>
    #include<stdlib.h>
    #include<string.h>
    #include<string>
    #include<map>
    #include<cmath>
    #include<iostream>
    #include <queue>
    #include <stack>
    #include<algorithm>
    #include<set>
    using namespace std;
    #define INF 1e8
    #define eps 1e-8
    #define LL long long
    #define N 100010
    #define mol 1000000007
    int i,n,t;  
    LL a[N],l[N],r[N],Max;  
    int main()  
    {  
        while (scanf("%d",&n) &&  n)  
        {  
            for (i=1; i<=n; ++i) scanf("%I64d",&a[i]);  
            l[1]=1;  
            r[n]=n;  
            for(i=2;i<=n;i++)
            {
                t=i;
                while(t>1&&a[i]<=a[t-1])//从左往右向左扩展
                    t=l[t-1];
                l[i]=t;
            }
            for(i=n-1;i>=1;i--)
            {
                t=i;
                while(t<n&&a[i]<=a[t+1])//从右往左向右扩展
                    t=r[t+1];
                r[i]=t;
            }
            Max=0;  
            for (i=1; i<=n; ++i)  
            {  
                if ((r[i]-l[i]+1)*a[i]>Max) 
                    Max=(r[i]-l[i]+1)*a[i];  
            }  
            printf("%I64d
    ",Max);  
        }  
        return 0;  
    }  



    1505题意:求最大零(F)矩阵,1506加强版,把2维转换化成以每一行底,组成的最大面积


    #include<cstdio>
    #include<stdlib.h>
    #include<string.h>
    #include<string>
    #include<map>
    #include<cmath>
    #include<iostream>
    #include <queue>
    #include <stack>
    #include<algorithm>
    #include<set>
    using namespace std;
    #define INF 1e8
    #define eps 1e-8
    #define LL long long
    #define maxn 1001
    #define mol 1000000007
    int t,n,m,a[maxn][maxn],l[maxn][maxn],r[maxn][maxn];
    char s[maxn];
    int main()
    {
    	
    	scanf("%d",&t);
    	while(t--)
    	{
    		scanf("%d%d",&n,&m);
    		int i,j;
    		memset(a,0,sizeof(a));
    		for(i=1;i<=n;i++)
    		{
    			for(j=1;j<=m;j++)
    			{
    				scanf("%s",s);
    				if(s[0]=='F') a[i][j]=a[i-1][j]+1;
    				else a[i][j]=0;
    			}
    		}
    		//printf("
    ");
    		int ans=0;
    		for(i=1;i<=n;i++)
    		{
    			int t;
    			l[i][1]=1;r[i][m]=m;
    			for(j=2;j<=m;j++)
    			{
    				t=j;
    				while(t>1&&a[i][j]<=a[i][t-1])
    					t=l[i][t-1];
    				l[i][j]=t;
    			}
    			for(j=m-1;j>0;j--)
    			{
    				t=j;
    				while(t<m&&a[i][j]<=a[i][t+1])
    					t=r[i][t+1];
    				r[i][j]=t;
    			}
    			for(j=1;j<=m;j++)
    			{
    				if(a[i][j]*(r[i][j]-l[i][j]+1)>ans) 
    					ans=a[i][j]*(r[i][j]-l[i][j]+1);
    			}
    		}
    		printf("%d
    ",ans*3);
    	}
    	return 0;
    }
    /*
    2
    5 6
    R F F F F F
    F F F F F F
    R R R F F F
    F F F F F F
    F F F F F F
    
    5 5
    R R R R R
    R R R R R
    R R R R R
    R R R R R
    R R R R R
    */
    


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    hdu 5112 A Curious Matt (水题)
    hdu 5464 Clarke and problem(dp)
    (2)线程优先级、线程安全
    (1)进程与线程
    并发与并行
    (5) 守护线程与线程阻塞
    java线程中断2
    sleep()和wait()的区别
    java线程中断
    java创建线程的三种方式及其对比
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4868003.html
Copyright © 2011-2022 走看看