hdu 3998 最長上公升子串行及個數)

2021-09-06 09:30:20 字數 1095 閱讀 5890

思路:可以用n*log(n)的做法求出最長上公升子串行,然後刪除原陣列中的這些數,再求最長上公升子串行(如果長度減小,則直接退出)。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7#define maxn 22222

8#define inf 1<<30

9int

dp[maxn];

10int

num[maxn];

11bool

mark[maxn];

12int

n,len,maxlen,_count;

1314

int search(int low,int high,int

number)

21return

low;22}

2324

intmain()

29 maxlen=-inf;

30 memset(mark,false,sizeof

(mark));

31while(1)42

}43if(len>maxlen)

44else

if(len==maxlen)_count++;

45else

break;46

}47 printf("

%d\n%d\n

",maxlen,_count);48}

49return0;

50}5152

53

ps:當然此題也可以用dp+最大流來求,首先求出最長上公升子串行的長度,然後就是建圖了,可以選擇源點為0,由於數列中的每乙個數只能使用一次,構圖的時候需要拆點。若有n個數,則拆成2 * n個點,構造源點和匯點,將每個點都和自己拆出來的點連邊,將源點和最長序列為1的點連邊,將最長序列為ans的點與匯點連邊,最後若dp[j] = dp[i] + 1,則將i + n和 j連邊。所有邊的流量都是1,這樣便可以限制每個點只使用一次。其實連邊的順序就是最長序列為1,2,3,...,ans。可以理解為從最長序列為1(該數本身)一直流到數列中的最長上公升序列。

hdu 3998 最長上公升子串行及個數)

思路 可以用n log n 的做法求出最長上公升子串行,然後刪除原陣列中的這些數,再求最長上公升子串行 如果長度減小,則直接退出 1 include2 include3 include4 include5 include6 using namespace std 7 define maxn 2222...

最長上公升子串行

問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...

最長上公升子串行

最長上公升子串行問題是各類資訊學競賽中的常見題型,也常常用來做介紹動態規劃演算法的引例,筆者接下來將會對poj上出現過的這類題目做乙個總結,並介紹解決lis問題的兩個常用 演算法 n 2 和 nlogn 問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7.an,求它的乙個子串行 設為s1...