POJ 1121-UNIMODAL PALINDROMIC DECOMPOSITIONS 动态规划

本文详细介绍了如何解决POJ平台上的问题,该问题要求找出给定数字可以分解为多少种特定类型的回文序列。通过使用动态规划方法,作者解释了如何计算每个可能的分解方式,并最终得出答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源: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 <iostream>
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值