poj 1221 dp(UNIMODAL PALINDROMIC DECOMPOSITIONS)
2015-01-31 17:29
579 查看
题意:给出一个数n,把它拆分成若干个数的和,要求这些数为UNIMODAL PALINDROMIC 的形式(见原题描述)。最大的数在中间并向两边非递增。问拆法有多少种。
思路:dp。dp[i][j]表示分解数i且分解后的序列中第一个数(显然最后一个数也是)是j的分解个数。dp[i][0]中存放整数 i 的分解方法个数。其中dp数组j只需考虑从0到i/3即可,因为如果第一个数和最后一个数大于i/3,那么这两个数之间必不存在数字,也即只剩下将n平分或者n不变这两种分发,特殊考虑即可。
思路:dp。dp[i][j]表示分解数i且分解后的序列中第一个数(显然最后一个数也是)是j的分解个数。dp[i][0]中存放整数 i 的分解方法个数。其中dp数组j只需考虑从0到i/3即可,因为如果第一个数和最后一个数大于i/3,那么这两个数之间必不存在数字,也即只剩下将n平分或者n不变这两种分发,特殊考虑即可。
#include <stdio.h> #include <string.h> #define N 1000 long long dp [N/3]; int n; int iseven(int x){ return !(x&1); } void init(){ int i,j,k; dp[1][0] = dp[1][1] = 1; for(i = 2;i<N-1;i++){ for(j = 1;j<=i/3;j++){ for(k = j ; i-2*j >= 3*k ; k++) dp[i][j] += dp[i-2*j][k]; if(iseven(i-2*j) && i/2-j>=j)//中间的数能够一分为二 dp[i][j] += 2; else dp[i][j]++; dp[i][0] += dp[i][j]; } dp[i][0] += iseven(i) + 1;//加上分成自身一个数的情况,以及如果是偶数分成平分的情况 } } int main(){ init(); while(scanf("%d",&n) && n) printf("%d %lld\n",n,dp [0]); return 0; }
相关文章推荐
- POJ 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS【DP】
- UNIMODAL PALINDROMIC DECOMPOSITIONS - POJ 1221 UVaLive 2560 dp
- poj 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS(母函数)
- ACM 动态规划 POJ 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS 题解
- [母函数]POJ 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS
- poj1221 UNIMODAL PALINDROMIC DECOMPOSITIONS
- poj 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS(递推/记忆化搜索+数学)
- poj 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS 整数拆分
- poj 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS (母函数)
- poj 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS (母函数)
- POJ 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS__动态规划
- POJ Unimodal Palindromic Decompositions(DP)
- POJ 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS
- poj 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS 动态规划
- POJ 1221 UNIMODAL PALINDROMIC DECOMPOSITIONS
- 1221--UNIMODAL PALINDROMIC DECOMPOSITIONS
- acm pku 1221 Unimodal palindromic decompositions的逻辑推理过程
- POJ 1121-UNIMODAL PALINDROMIC DECOMPOSITIONS 动态规划
- POJ #1221 - NIMODAL PALINDROMIC DECOMPOSITIONS
- poj 算法基础 编程题#1:UNIMODAL PALINDROMIC DECOMPOSITIONS