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

Hdu5087Revenge of LIS II简单dp

时间:2014-11-04 09:17:01      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   os   for   sp   div   on   

有个坑点,就是转移的时候前面状态数量如果不同,后面即使从同一个点转移过来,也是不同的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#include<stdlib.h>
using namespace std;


typedef long long LL;
const LL maxn = 1111;
LL dp[maxn];
LL dp1[maxn];
LL cnt[maxn];
LL a[maxn];
int main()
{
    LL T;
    LL n;
    cin>>T;
    while(T--){
        cin>>n;
        for(LL i =1;i<=n;i++)
            cin>>a[i];
        for(LL i =1;i<=n;i++){
            dp[i]=1;
            for(LL j=1;j<i;j++)
                if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+1);
        }
        for(LL i =1;i<=n;i++){
            dp1[i]= 1;if(dp1[i]==dp[i]) cnt[i] =1;else cnt[i] = 0;
            for(LL j=1;j<i;j++){
                if(a[i]>a[j]){
                    if(dp1[i]<=dp1[j]+1&&dp1[j]+1==dp[i]) cnt[i]+=cnt[j];
                    if(dp1[i]<dp1[j]+1) dp1[i]=dp1[j]+1;
                }
            }
        }
        LL ans=0;
        LL Max= - 1;
        for(LL i=1;i<=n;i++)
            if(Max<dp[i]) Max =dp[i];
        for(LL i=1;i<=n;i++)
            if(dp[i]==Max) ans+=cnt[i];
        if(ans==1) cout<<Max-1<<endl;
        else cout<<Max<<endl;

    }
    return 0;
}

 

Hdu5087Revenge of LIS II简单dp

标签:style   blog   io   color   os   for   sp   div   on   

原文地址:http://www.cnblogs.com/yigexigua/p/4072694.html

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