51nod 序列分解(dfs)

2021-07-28 07:54:03 字數 1292 閱讀 9932

1400 序列分解

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 

難度:4級演算法題

小刀和大刀是雙胞胎兄弟。今天他們玩乙個有意思的遊戲。 大刀給小刀準備了乙個長度為n的整數序列。小刀試著把這個序列分解成兩個長度為n/2的子串行。

這兩個子串行必須滿足以下兩個條件:

1.他們不能相互重疊。

2.他們要完全一樣。

如果小刀可以分解成功,大刀會給小刀一些糖果。

然而這個問題對於小刀來說太難了。他想請你來幫忙。

input

第一行給出乙個t,表示t組資料。(1<=t<=5)

接下來每一組資料,輸入共2行。

第一行包含乙個整數n (2<=n<=40且為偶數)。

第二行給出n個整數a[0],a[1],a[2],…,a[n-1]表示大刀給小刀準備的序列。(-1,000,000,000<=a[i]<=1,000,000,000)

output

如果小刀可以完成遊戲,輸出"good job!!" (不包含引號),否則 輸出"what a pity!" (不包含引號)。
input示例

2

41 1 2 2

61 2 3 4 5 6

output示例

good job!!

what a pity!

system message

(題目提供者)

題解:從第乙個數字開始搜尋,當前數字有兩種情況,

第一,該數字沒有出現過

則一定存在於第乙個序列

第二,改數字出現過,擇優兩種選擇,第乙個序列第二個序列都有可能存在

則分別dfs即可

#include#include#includeusing namespace std;

typedef long long ll;

ll a[55],b[55],c[55];

ll n,flag;

void dfs(ll id,ll len1,ll len2,ll x)

//id表示當前遍歷到第i個數字

//len1,len2分別表示兩個序列當前的長度

//x表示當前匹配到第乙個子串行的第x個數字

if(id==1)

else

b[len1]=a[id];

dfs(id+1,len1+1,len2,x);

} return;

}int main()

}

51 nod 1400 序列分解 dfs 剪枝

1400 序列分解 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 小刀和大刀是雙胞胎兄弟。今天他們玩乙個有意思的遊戲。大刀給小刀準備了乙個長度為n的整數序列。小刀試著把這個序列分解成兩個長度為n 2的子串行。這兩個子串行必須滿足以下兩個條件 1.他們不能相互重疊...

51nod 排列與交換 序列dp

算是比較簡單的七級題了吧,也是經典的序列交換型別的dp。明顯有f i j 表示前i個交換j次的方案數。對於第一問,每次轉移的時候直接把之前的方案繼承過來。最後統計答案的時候,只要交換次數與k的奇偶性相同,就可累加到答案內,因為剩餘的步數我可以兩點之間xjb交換。但是會算重,因為我這樣的計算是盡量把每...

51NOD 最長遞增子串行(模板)

1134 最長遞增子串行 給出長度為n的陣列,找出這個陣列的最長遞增子串行。遞增子串行是指,子串行的元素是遞增的 例如 5 1 6 8 2 4 5 10,最長遞增子串行是1 2 4 5 10。input 第1行 1個數n,n為序列的長度 2 n 50000 第2 n 1行 每行1個數,對應序列的元素...