我是靠谱客的博主 愉快火,最近开发中收集的这篇文章主要介绍poj1221 2010.2.17,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

poj1221 2010.2.17

题意:

 

    给一个正整数,求出它的UnimodalPalindromic的个数,所谓的Unimodal Palindromic就是一系列数,单调递增再递减,并且第一个和最后一个数相同,第二个跟倒数第二个数相同,即第i个跟第n-i+1个数相同 

 

思路:

 

    完全没思路,感觉跟DP扯不上半点关系,后来网上找了些解题报告研究一下午才搞出来。这个题做得很猥琐。

 

    把它的UnimodalPalindromic分成两部分:一部分是最小数是j的,就是第一个跟最后一个数等于j的有几个;第二部分是最小数大于j的,可以是j+1,j+2…..的有几个。

 

   s[i][j]表示和为i,最小数是j的序列的个数。那么第一部分就是s[i-j*2][j],

 

意思就是和为去掉了首尾两个数后的和,最小数是j;第二部分就是s[i][j+1].最小数大于j的情况的个数。状态转移方程:

 

s[i][j] = s[i-2*j] + s[i][j+1]

 

初始化:

 

①.s[0][j]初始值1.因为当需要调用s[0][j]时,表示拆成了两个相同的数。有一个

 

②.S[i][j](i<j)初始值0,不可能的情况

 

③.S[i][j] (i>=j >i/2) 初始值1,j>i/2时所有s[i][j]都是1,那个就是i本身。

#include <string.h>
#include <stdio.h>

#define N 300

int main()
{
	int i,j;
	int n;
	unsigned int s[N][N];
	memset(s,0,sizeof(s));
	for(i=1;i<N;i++)
		s[0][i]=1;
	for(i=1;i<N;i++)
		for(j=i/2+1;j<=i;j++)
			s[i][j]=1;
	for(i=2;i<N;i++)
		for(j=i/2;j>0;j--)
			s[i][j]=s[i-2*j][j]+s[i][j+1];
	while (scanf("%d",&n),n)
		printf("%d %un",n,s[n][1]);
	return 0;
}


最后

以上就是愉快火为你收集整理的poj1221 2010.2.17的全部内容,希望文章能够帮你解决poj1221 2010.2.17所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部