思路:可以用n*log(n)的做法求出最長上公升子串行,然後刪除原陣列中的這些數,再求最長上公升子串行(如果長度減小,則直接退出)。
1 #include2 #include3 #include4 #include5 #include6ps:當然此題也可以用dp+最大流來求,首先求出最長上公升子串行的長度,然後就是建圖了,可以選擇源點為0,由於數列中的每乙個數只能使用一次,構圖的時候需要拆點。若有n個數,則拆成2 * n個點,構造源點和匯點,將每個點都和自己拆出來的點連邊,將源點和最長序列為1的點連邊,將最長序列為ans的點與匯點連邊,最後若dp[j] = dp[i] + 1,則將i + n和 j連邊。所有邊的流量都是1,這樣便可以限制每個點只使用一次。其實連邊的順序就是最長序列為1,2,3,...,ans。可以理解為從最長序列為1(該數本身)一直流到數列中的最長上公升序列。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
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...