#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
const int maxn = 250 + 5;
LL FS[maxn]; //FS[i] 表示总和为 i的非下降子序列个数; (FS[i] = ∑F[i][j],(1<=j<=i))
LL F[maxn][maxn]; //F[i][j] 表示 总和为 i ,以j结尾的非下降子序列总数
LL C[maxn]; // C[i] 表示总和为i的单峰回文序列数目 (C[i] = ∑D[i][j],(1<=j<=i))
LL D[maxn][maxn]; //D[i][j] 表示 总和为 i , 以j为峰值的非下降子序列总数
//上面的FS数组 没有用到。。。。 思路还是分析的有点乱!!
void pre() { //初始化 总和为N的非下降子序列总数
memset(F, 0, sizeof(F));
for(int i = 1; i < maxn; i++) {
LL ast = 0;
for(int j = 1; j <= i; j++) {
for(int k = 1; k <= j; k++) {
if(i == j) F[i][j] = 1;
else F[i][j] += F[i-j][k];
}
ast += F[i][j];
}
FS[i] = ast;
}
}
void pre2() {
for(int i = 1; i < maxn; i++) {
LL ast = 0;
for(int j = 1; j <= i; j++) {
D[i][j] = 0;
if(i == j) D[i][j] = 1;
else {
int temp = i-j;
if(!(temp%2)) D[i][j] += F[temp/2+j][j];
if(temp>j && (temp-j)%2 == 0) D[i][j] += F[(temp-j)/2+j][j];
else if(temp == j) D[i][j]++;
}
ast += D[i][j];
}
C[i] = ast;
}
}
int main() {
pre();
pre2();
// for(int i = 1; i < maxn; i++) {
// cout << " " << i << " " << FS[i] << endl;
// }
int N;
while(cin >> N && N) {
cout << N << " " << C[N] << endl;
}
return 0;
}
UNIMODAL PALINDROMIC DECOMPOSITIONS-----动态规划-------单峰回文序列分解
最新推荐文章于 2022-11-11 16:11:57 发布