1400 序列分解
基準時間限制:1 秒 空間限制:131072 kb 分值: 40
難度:4級演算法題
小刀和大刀是雙胞胎兄弟。今天他們玩乙個有意思的遊戲。 大刀給小刀準備了乙個長度為n的整數序列。小刀試著把這個序列分解成兩個長度為n/2的子串行。
這兩個子串行必須滿足以下兩個條件:
1.他們不能相互重疊。
2.他們要完全一樣。
如果小刀可以分解成功,大刀會給小刀一些糖果。
然而這個問題對於小刀來說太難了。他想請你來幫忙。
input
第一行給出乙個t,表示t組資料。(1<=t<=5)output接下來每一組資料,輸入共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)
如果小刀可以完成遊戲,輸出"good job!!" (不包含引號),否則 輸出"what a pity!" (不包含引號)。input示例
2output示例41 1 2 2
61 2 3 4 5 6
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個數,對應序列的元素...