單峰回文脫模

2021-10-06 17:05:36 字數 1805 閱讀 8349

題目描述:如果值不降低到中間值,則回文序列是單峰回文序列,然後(由於該序列是回文序列)不從中間增加到終點,例如,上面的第乙個示例序列不是單峰回文序列,而第二個例子是。

單峰回文序列是整數n的單峰回文分解,如果數列中的整數之和為n,例如,前幾個整數的單峰回文分解如下:

1: (1)

2: (2), (1 1)

3: (3), (1 1 1)

4: (4), (1 2 1), (2 2), (1 1 1 1)

5: (5), (1 3 1), (1 1 1 1 1)

6: (6), (1 4 1), (2 2 2), (1 1 2 1 1), (3 3),

(1 2 2 1), ( 1 1 1 1 1 1)

7: (7), (1 5 1), (2 3 2), (1 1 3 1 1), (1 1 1 1 1 1 1)

8: (8), (1 6 1), (2 4 2), (1 1 4 1 1), (1 2 2 2 1),

(1 1 1 2 1 1 1), ( 4 4), (1 3 3 1), (2 2 2 2),

(1 1 2 2 1 1), (1 1 1 1 1 1 1 1)

編寫乙個程式,計算乙個整數的單峰數。

輸入輸入由一系列正整數組成,一行以0(0)結尾,表示結束。

樣例輸入23

4567

8102324

131213920

樣例輸出

2 23 2

4 45 3

6 77 5

8 11

10 17

23 104

24 199

131 5010688

213 1055852590

92 331143

提示

n<250

ac**如下:

/*

奇數 n 只可能有長度為奇數的單峰回文劃分;

而偶數則可以有長度為奇數的回文劃分,也可以有長度為偶數的回文劃分。

*/#include

#include

using

namespace std;

long

long dp[

300]

[300]=

;//表示左邊元素之和為i,元素不大於j的情況個數總數

intmain()

for(

int i =

1; i <

300; i++

) dp[j]

[i]= dp[j]

[i -1]

+ dp[j - i]

[i];

//狀態轉移方程

/** * 劃分中每個數都小於 m, 相當於每個數不大於 m- 1, 故劃分數為 dp[n][m-1]。

* 劃分中有乙個數為 m. 那就在 n中減去 m , 剩下的就相當於把 n-m 進行劃分, 故劃分數為 dp[n-m][m];

**/}}

while(1

)}}else

//是偶數

} s = n /2;

//偶數數列

sum +

= dp[s]

[s];

} sum++

;//本身

cout << n <<

" "<< sum << endl;

}system

("pause");

return0;

}