題目描述:如果值不降低到中間值,則回文序列是單峰回文序列,然後(由於該序列是回文序列)不從中間增加到終點,例如,上面的第乙個示例序列不是單峰回文序列,而第二個例子是。
單峰回文序列是整數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;
}