码迷,mamicode.com
首页 > 其他好文 > 详细

hdoj 1506&&1505(City Game) dp

时间:2015-03-12 17:16:20      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:dp   algorithm   

// l表示从l[i]到i连续大于a[i]的最远左区间,r表示从i到r[i]连续大于a[i]的最远又区间

DP 找出 a[i] 的最远左区间和最远右区间与自己连着的比自己大的数的长度 , 然后用这个长度乘以 a[i], 乘积最大的那个就是答案

hdoj 1506

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 100000+10
#define INF 0xfffffff
#define ll __int64
ll Max(ll x,ll y)
{
    if(x>y)
        return x;
    return y;
}
ll r[N],l[N];
ll a[N];
int main()
{
    ll n;
    while(scanf("%I64d",&n),n)
    {
        for(int i=1;i<=n;i++)
            scanf("%I64d",&a[i]);
        a[0]=a[n+1]=-INF;
        l[0]=r[n+1]=0;
        for(int i=1;i<=n;i++)
        {
            
                l[i]=i;
                while(a[l[i]-1]>=a[i])
                   l[i]=l[l[i]-1];
            

        }
        for(int i=n;i>=1;i--)
        {
            
          
                r[i]=i;
                while(a[r[i]+1]>=a[i])
                    r[i]=r[r[i]+1];



        }
        ll maxn=0;
        for(int i=1;i<=n;i++)
        {
            maxn=Max((r[i]-l[i]+1)*a[i],maxn);
        }
        printf("%I64d\n",maxn);
    }
    return 0;
}

hdoj 1505是1506的加强版,对于矩阵的每一行采取同样的操作

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define  N 1000+10
char a[N][N];
int dp[N][N];
int r[N],l[N];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        int maxn=0;
        scanf("%d%d",&n,&m);
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
                {
                    scanf(" %c",&a[i][j]);
                    if(a[i][j]=='R')
                        dp[i][j]=0;
                    else
                        dp[i][j]=dp[i-1][j]+1;
                }
        }

        for(int i=1;i<=n;i++)
        {
            dp[i][0]=dp[i][m+1]=-1;
            l[0]=r[m+1]=0;
            for(int j=1;j<=m;j++)
            {
                l[j]=j;
                while(dp[i][l[j]-1]>=dp[i][j])
                   l[j]=l[l[j]-1];
            }
            for(int j=m;j>=1;j--)
            {
                
                r[j]=j;
                while(dp[i][r[j]+1]>=dp[i][j])
                   r[j]=r[r[j]+1];
                
            }
            for(int j=1;j<=m;j++)
            {
                maxn=max(maxn,(r[j]-l[j]+1)*3*dp[i][j]);
            }


        }
        printf("%d\n",maxn);
    }
    return 0;
}


hdoj 1506&&1505(City Game) dp

标签:dp   algorithm   

原文地址:http://blog.csdn.net/u012515742/article/details/44222455

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!