給定乙個長度為n(n為偶數)的序列,問能否將其劃分為兩個長度為n/2的嚴格遞增子串行
一般青年dp方案:f[i][j][k][l] 表示前i+j位分為乙個長度為i以j結尾,乙個長度為k以l結尾的序列 是否可行(0,1)
省略已知值:觀察發現j和l中至少有乙個為a[i+j] 故可省略其中一位 n=2000必跪
文藝青年dp方案: 挪位得解:把f[i][j][k]中的k挪出來 原因:顯然i和j不變時,我們希望k越小越好 所以記錄min(k),並記錄無解情況 o(n^2)
在前i位中找長j位的以第i位結尾的上公升子串行,並且剩下的也是上公升子串行,那麼f[i][j]表示剩下的(即前i位中長i-j位的不以第i位結尾的)上公升子串行的最後一位的最小值。
然後轉移:
如果a[i]如果f[i][j]#include#include#include#define inf 2139062143
using namespace std;
int n;
int a[2001],f[2001][2001];
int main()
f[1][1]=-1;
for(int i=1;i<=n;i++)
}} if(f[n][n/2]==inf) cout<<"no!" } 這題乍一看毫無思路。顯然不可能窮舉長度為n 2的嚴格遞增子串行。不過聯想到noip1999 普及組 的飛彈攔截的第二問,就有思路了。這題其實與它的第二問差不多,只要算出該序列的最大非公升子串行長度l,判斷一下是否大於2即可。1.假如l 2,顯然乙個嚴格遞增子串行至多包含非公升子串行的乙個元素,2個子... 給定乙個長度為n n為偶數 的序列,問能否將其劃分為兩個長度為n 2的嚴格遞增子串行,輸入格式 若干行,每行表示一組資料。對於每組資料,首先輸入乙個整數n,表示序列的長度。之後n個整數表示這個序列。輸出格式 同輸入行數。對於每組資料,如果存在一種劃分,則輸出 yes 否則輸出 no 輸入樣例 1 6... 給定乙個長度為n n為偶數 的序列,問能否將其劃分為兩個長度為n 2的嚴格遞增子串行,輸入格式 若干行,每行表示一組資料。對於每組資料,首先輸入乙個整數n,表示序列的長度。之後n個整數表示這個序列。輸出格式 同輸入行數。對於每組資料,如果存在一種劃分,則輸出 yes 否則輸出 no 輸入樣例 1 6...洛谷 P1410 子串行
洛谷 P1410 子串行
洛谷P1410 子串行