如题:http://poj.org/problem?id=1221
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5096 | Accepted: 2482 |
Description
23 11 15 1 37 37 1 15 11 23
1 1 2 3 4 7 7 10 7 7 4 3 2 1 1
A Palindromic sequence is Unimodal Palindromic if the values do not decrease up to the middle value and then (since the sequence is palindromic) do not increase from the middle to the end For example, the first example sequence above is NOT Unimodal Palindromic while the second example is.
A Unimodal Palindromic sequence is a Unimodal Palindromic Decomposition of an integer N, if the sum of the integers in the sequence is N. For example, all of the Unimodal Palindromic Decompositions of the first few integers are given below:
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)
Write a program, which computes the number of Unimodal Palindromic Decompositions of an integer.
Input
Output
Sample Input
2 3 4 5 6 7 8 10 23 24 131 213 92 0
Sample Output
2 2 3 2 4 4 5 3 6 7 7 5 8 11 10 17 23 104 24 199 131 5010688 213 1055852590 92 331143
Source
题目大意:要求求出总和是n的满足山峰序列的个数。山峰序列:中心对称,并且数值从低到中间非递减。
思路:dp[i][j]:当前总和为n,并且序列中最小的那个数j。
dp[i][j]=dp[i-2*j][k](j<=k<=i-2*j)
返回值用long long.
注意dp初始化。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 250
#define ll long long
ll dp[MAXN][MAXN]; //dp[i][j]=sum(dp[i-2*j][k]) (j<=k<=i-2*j)
int n;
void form()
{
int i,j,k;
for(i=0;i<MAXN;i++)
dp[i][i]=dp[i][0]=1;
for(i=2;i<MAXN;i++)
for(j=1;j<=i/2;j++)
{
if(i-2*j==0)
dp[i][j]=1;
else
for(k=j;k<=i-2*j;k++)
dp[i][j]+=dp[i-2*j][k];
}
}
int main()
{
// freopen("C:\\1.txt","r",stdin);
form();
while(~scanf("%d",&n))
{
if(n==0)
break;
int i;
ll sum=0;
for(i=1;i<=n/2;i++)
sum+=dp[n][i];
sum+=dp[n][n];
printf("%d %I64d\n",n,sum);
}
return 0;
}