POJ 1121-UNIMODAL PALINDROMIC DECOMPOSITIONS 动态规划

题目来源:http://poj.org/problem?id=1221

解题报告:

这道题求的是给定一个数字n,求n可以拆成多少种unimodal palindromic decompositions。也就是首先满足回文串的性质,然后前半部分是递增顺序的。

我的解法是:

取f[n][k],代表对n,取回文串的第一个数>=k时的palindromic decompositions的种数。

那么,对f[n][k],先计算f'[n][k]代表回文串的第一个数为k是的Palindromic decompositions的种数。

那么有f'[n][k] = f[n-2*k][k],其中1<=k <=n/2

于是f[n][k] = f'[n][k] + f'[n][k+1] + ... + f[n][n]

最后要求的就是f[n][1]


#include 
using namespace std;

#define N 300

long long *f[N];  //注意精度,用long long, 因为这个WA了好几次。

void compute(int n);

long long get(int n, int k) {
	if (f[n][k]!=0)
		return f[n][k];
	else
		compute(n);
	return f[n][k];
}

void compute(int n) {
	if (f[n][n] != 0) {
		return;
	}
	for (int j = 1; j<=n/2;j++) {
		if (n-2*j >= j) {
			f[n][j] += get(n-2*j,j);
		}
	}
	if ((n/2)*2 == n)
		f[n][n/2] += 1;
	f[n][n]=1;
	for (int j=n-1; j>=1;j--) {
		f[n][j] += f[n][j+1];
	}
}



int main()
{
	for (int i =0 ; i< N; i++) {
		f[i] = new long long[i+1];
		for (int j=0;j<=i;j++) {
			f[i][j] = 0;
		}
	}

	int n;
	cin >> n;
	f[1][1]=1;
	while(n!=0)
	{
		compute(n);
		cout << n << " " << f[n][1] << endl;
		cin >> n;
	}
}

附录:

Description

A sequence of positive integers is Palindromic if it reads the same forward and backward. For example: 
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

Input consists of a sequence of positive integers, one per line ending with a 0 (zero) indicating the end. 

Output

For each input value except the last, the output is a line containing the input value followed by a space, then the number of Unimodal Palindromic Decompositions of the input value. See the example on the next page. 

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

你可能感兴趣的:(POJ 1121-UNIMODAL PALINDROMIC DECOMPOSITIONS 动态规划)