原來b序列並不是最長上公升子串行,雖然他確實是上公升的,但是順序不一定對(指它不一定是原序列的乙個子串行)。
模板。
int lis() else
}return len;
}
把上面的大於換成大於等於,把大於等於(lower_bound())換成大於(upper_bound())。
int lis() else
}return len;
}
題目鏈結
這裡要求最長下降子串行的長度,並劃分為若干個不下降子串行。於是把數字全部取反,轉化成求最長上公升子串行的長度,並劃分為若干個不上公升的子串行。
考慮 \(b[x]\) 的意思是當前字串長度為 \(x\) 的上公升子串行的最優結尾字元,在lower_bound()找到 \(pos\) 之後就說明 \(a[i]\) 這個字元是可以替換掉 \(b[pos]\) 原本的字元的,所以在進行鏈劃分的時候可以直接接在這個字元的後面!
int n;
char s[200005];
int a[200005];
int b[200005];
int id[200005];
int c[200005];
int lis() else
}return len;
}void test_case()
從這裡可以得到啟發,每次找到乙個位置之後都往接在原來的後面,在得到最長上公升子串行的同時就會得到乙個不下降子串行的鏈劃分。且把這些鏈的末端連起來應該就是最長上公升子串行。 動態規劃 最長上公升子串行
問題描述 乙個數的序列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 等等...
動態規劃 最長上公升子串行
動態規劃 儲存遞迴中間結果,減少遞迴次數 總時間限制 2000ms 記憶體限制 65536kb 描述 乙個數的序列 bi,當 b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2 an 我們可以得到一些上公升的子串行 ai1,ai2 aik 這裡1 i1 i2 ik n。...
動態規劃 最長上公升子串行
總時間限制 2000ms 記憶體限制 65536kb 描述乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它...