POJ 1221 整数分解 DP
2016-07-27 13:15
369 查看
POJ 1221 题意:将给定的整数N分解为多个整数的和 要求这个序列为回文串 且前半部分为非递减序列 dp[i,j] 表示将整数i分解为以j为开头的序列的方案数 得到状态转移公式 dp[i,j] = dp[i - 2 * j][k] (k * 2 <= i - 2 * j ^ k >= j ) 如果i - j * 2 >= j :dp[i,j]++ 以上公式 的意思为 以j为将i分解的方案数 等于 以k k大于等于j 将 i - 2 * j 分解的方案数 如果以j将i分解 能分解为形如j (i - j * 2) j 的正确格式则答案加一
代码如下:
#include <cstdio> #include <iostream> #include <queue> #include <cstring> #define sf scanf #define pf printf using namespace std; typedef long long LL; LL dp[1000][1000]; // dp(i,j)为左右为j时组成i的方案数 LL dps(int i,int j){ if(j * 2 > i) return dp[i][j] = 0; if(j * 2 == i) return dp[i][j] = 1; if(dp[i][j] != -1) return dp[i][j]; dp[i][j] = (i - 2 * j >= j); for(int k = j;k * 2 <= i - j * 2;++k){ dp[i][j] += dps(i - j * 2,k); } return dp[i][j]; } int main(){ memset(dp,-1,sizeof(dp)); int n; while( sf("%d",&n) != EOF && n ){ LL ans = 1; for(int i = 1;i <= n;++i){ ans += dps(n,i); } pf("%d %lld\n",n,ans); } return 0; }
相关文章推荐
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android dpi,dip,dp的概念以及屏幕适配
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ 2159 Ancient Cipher
- POJ 2635 The Embarrassed Cryptographe