洛谷 P1410 子串行

2021-07-24 14:38:02 字數 1132 閱讀 1200

這題乍一看毫無思路。顯然不可能窮舉長度為n/2的嚴格遞增子串行。

不過聯想到noip1999(普及組)的飛彈攔截的第二問,就有思路了。這題其實與它的第二問差不多,只要算出該序列的最大非公升子串行長度l,判斷一下是否大於2即可。

1.假如l>2,顯然乙個嚴格遞增子串行至多包含非公升子串行的乙個元素,2個子串行至多包含2個元素,故兩個嚴格遞增子串行不可能把原序列的每個元素都包含,所以輸出no!

2.假如l<=2:

2.1若l=1,顯然原序列嚴格遞增,必能按照題意劃分,輸出yes!

2.2若l=2,用反證法易得去除乙個長度為2的非公升子串行之後的序列嚴格遞增。

因此,將這兩個元素分別放到兩個子串行裡面,總能構造出兩個嚴格遞增的子串行。

【分析】

orz題解,真的好強嗚嗚哇哇

[題解 by courage]

這題乍一看毫無思路。顯然不可能窮舉長度為n/2的嚴格遞增子串行。

不過聯想到noip1999(普及組)的飛彈攔截的第二問,就有思路了。這題其實與它的第二問差不多,只要算出該序列的最大非公升子串行長度l,判斷一下是否大於2即可。

1.假如l>2,顯然乙個嚴格遞增子串行至多包含非公升子串行的乙個元素,2個子串行至多包含2個元素,故兩個嚴格遞增子串行不可能把原序列的每個元素都包含,所以輸出no!

2.假如l<=2:

2.1若l=1,顯然原序列嚴格遞增,必能按照題意劃分,輸出yes!

2.2若l=2,用反證法易得去除乙個長度為2的非公升子串行之後的序列嚴格遞增。

因此,將這兩個元素分別放到兩個子串行裡面,總能構造出兩個嚴格遞增的子串行。

【**】

#include

#include

#include

#define fo(i,j,k) for(i=j;i<=k;i++)

using

namespace

std;

int a[2005],dp[2005],n;

int main()

ans=max(ans,dp[i]);

}if(ans<=2) printf("yes!\n");

else

printf("no!\n");

}return

0;}

洛谷 P1410 子串行

給定乙個長度為n n為偶數 的序列,問能否將其劃分為兩個長度為n 2的嚴格遞增子串行,輸入格式 若干行,每行表示一組資料。對於每組資料,首先輸入乙個整數n,表示序列的長度。之後n個整數表示這個序列。輸出格式 同輸入行數。對於每組資料,如果存在一種劃分,則輸出 yes 否則輸出 no 輸入樣例 1 6...

洛谷P1410 子串行

給定乙個長度為n n為偶數 的序列,問能否將其劃分為兩個長度為n 2的嚴格遞增子串行,輸入格式 若干行,每行表示一組資料。對於每組資料,首先輸入乙個整數n,表示序列的長度。之後n個整數表示這個序列。輸出格式 同輸入行數。對於每組資料,如果存在一種劃分,則輸出 yes 否則輸出 no 輸入樣例 1 6...

P1410 子串行 動態規劃

給定乙個長度為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必跪 文...