题意:计算出一个数可以划分为多少个单峰回文数序列。
解法:DP。num[i][j]记录着数i可以划分为以大于等于j的数开头和结尾的单峰回文数的数量。开始初始化num[0][i]全部为1.
转移方程:
num[i][j]=1 (i==j) (j==i)
num[i][j]=num[i][j+1] (i<j*2) (j从i/2+1到i-1)
num[i][j]=num[i][j+1]+num[i-j*2][j] (i>=j*2) (j从1到i/2)
代码:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <vector>
using namespace std;
long long num[1100][1100];
int main()
{
//freopen("in.txt","r",stdin);
for(int i=0;i<1020;i++)
num[0][i]=1;
for(int i=1;i<1020;i++){
for(int j=i;j>=1;j--){
if(i==j)
num[i][j]=1;
else{
num[i][j]=num[i][j+1];
if(i-j*2>=0)
num[i][j]+=num[i-j*2][j];
}
}
}
int a;
while(scanf("%d",&a)==1)
{
if(a==0)
break;
cout<<a<<" "<<num[a][1]<<'\n';
}
return 0;
}