写下这道题的原因很简单= =,因为这一题的状态转移方程不好找,另一方面,我看到很多针对这一题写的解题报告都把累加状态说得模棱两可,甚至直接说成了一个单一状态,弄得本是菜鸟的我硬生生折磨了一上午画了几个10*10的表才想出来(各种表思路还不一样= =||)


  题意:对整数N(N<250)进行划分,划分成单峰回文序列,题目给出K组N,然后求出相应总序列数目。

  例如:

  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);

  解题思路:

    由于给出整数最大可到100+,我们可以想象一下100的整数划分之后的情况数绝对是一个很大的数字了。如果一 一枚举并进行判断无疑会TLE。

    但我们可以得出一种递推关系,例如 2.3.4.5.4.3.2 这种由23划分出的序列只要左右加上1就变成了 1.2.3.4.5.4.3.2.1 ,换成2就成为 2.2.3.4.5.4.3.2.2也就是说  27和25划分的部分序列可以根据23划分的部分序列来递推得到。

    既然有递推关系且我们可以知道上述单个状态是无后效性的,那么我们就可以用动态规划来完成这一递推

    我们简单假设A划分出的序列a1,a2,a3,a2,a1 可推出 由B划分的序列a0,a1,a2,a3,a2,a1,a0

    ps: 其中A = B - 2*a0

     那么我们递推的两个序列只需要满足a0<=a1即可

    我们用DP[A][a1]将A划分出的序列两端数字>=a1的总序列数作为一种状态,这样我们可以得到DP[B][a0]的全部序列

                        A中两端数大于i的总序列数

                             |

    因此我们可以找到一个状态转移方程:dp[n][i] = dp[n-i*2][i] + dp[n][i+1];

                       |             |

                  B中两端数>=i的总序列       B中两端数 >= i+1 的总序列数

        因此最终Code为:

      

 //UNIMODAL PALINDROMIC DECOMPOSITIONS
//整数划分 -> 单峰回文序列
//二维DP-状态转移方程挺难想的,要以整数划分后得到的单峰回文序列两端数字>=i为一个状态
//Memory:664K Time:0 Ms
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 251
long long dp[MAX][MAX]; //dp[n][i]代表整数为n进行划分时,两端处数字>=i的总情况数
void DP()
{
for (int i = ; i < MAX; i++)
dp[i][i] = ;
for (int i = ; i < MAX; i++)
for (int j = i - ; j >= ; j--)
{
dp[i][j] = dp[i][j + ];
if (i - j * == ) //刚好划分完
dp[i][j]++;
else if (i - j * >= j) //可以继续划分
dp[i][j] += dp[i - j * ][j]; //将i-j*2划分后且两端>=j的状态总数 转移给 i划分后两端为j的状态
}
}
int main()
{
DP();
int n;
while (scanf("%d", &n), n)
printf("%d %lld\n", n, dp[n][]);
return ;
}

小墨原创

                              

ACM/ICPC 之 DP-整数划分问题初探 (POJ1221)的更多相关文章

  1. 区间dp 整数划分问题

    整数划分(四) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近 ...

  2. ACM/ICPC 之 DP解有规律的最短路问题(POJ3377)

    //POJ3377 //DP解法-解有规律的最短路问题 //Time:1157Ms Memory:12440K #include<iostream> #include<cstring ...

  3. ACM/ICPC 之 DP进阶(51Nod-1371(填数字))

    原题链接:填数字 顺便推荐一下,偶然看到这个OJ,发现社区运营做得很赞,而且交互和编译环境都很赞(可以编译包括Python,Ruby,Js在内的脚本语言,也可以编译新标准的C/C++11,甚至包括Go ...

  4. 2016 ACM/ICPC Asia Regional Shenyang Online 1009/HDU 5900 区间dp

    QSC and Master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  5. 2016 ACM/ICPC Asia Regional Shenyang Online 1007/HDU 5898 数位dp

    odd-even number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  6. HDU 5000 2014 ACM/ICPC Asia Regional Anshan Online DP

    Clone Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) Total Submiss ...

  7. hdu1028(整数划分问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1028 整数划分问题 整数划分 --- 一个老生长谈的问题: 描述 整数划分是一个经典的问题.请写一个程 ...

  8. ACM ICPC Kharagpur Regional 2017

    ACM ICPC Kharagpur Regional 2017 A - Science Fair 题目描述:给定一个有\(n\)个点,\(m\)条无向边的图,其中某两个点记为\(S, T\),另外标 ...

  9. 2017 ACM ICPC Asia Regional - Daejeon

    2017 ACM ICPC Asia Regional - Daejeon Problem A Broadcast Stations 题目描述:给出一棵树,每一个点有一个辐射距离\(p_i\)(待确定 ...

随机推荐

  1. Xcode常用技巧(1)-使用Xcode进行代码分析及GDB调试

    1. 使用Xcode分析代码,分析分为静态分析及动态分析 静态分析:(Xcode-Product-Analyze)  检测代码是否有潜在的内存泄露  编译器认为不太合适的代码 运行结果: 若程序有 ...

  2. 弹出框四 之toastr.js (完成提示框)

    1.下载 toastr.js组件 2. $(function () { toastr.success('提交数据成功'); toastr.error('Error'); toastr.warning( ...

  3. php json_decode 函数

    json_decode 函数 url地址:http://php.net/manual/en/function.json-decode.php json_decode (PHP 5 >= 5.2. ...

  4. High Frequency Trading (整理中...)

    什么是高频交易系统 1 交易指令完全是由电脑发送,对市场数据的响应延时在微秒级2 系统有专用的软硬件组成,研发时需要大量的计算机专家级的工作3 系统的硬件需要放在离交易所主机很近的位置,所谓co-lo ...

  5. 详细解读PHP时区修改正确方法

    .修改PHP.ini这个文件 找到date.timezone这行,去掉前面的分号,改成: date.timezone = Asia/Shanghai .修改 .htaccess文件 修改.htacce ...

  6. Linux关于添加硬盘的那些事儿:笔记

    添加新硬盘:http://note.youdao.com/share/?id=8cf27602cdce36e1d4160f00e9004b00&type=note 关于添加硬盘的那些事儿:   ...

  7. 避免重定向301&302 (Avoid Redirects)

    这个也是Best Practices for Speeding Up Your Web Site的第12条原则: 重定向的意思是,用户的原始请求(例如请求A)被重定向到其他的请求(例如请求B).这是H ...

  8. HDU 5120 A Curious Matt(2014北京赛区现场赛A题 简单模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5112 解题报告:扫一遍 #include<cstdio> #include<cstr ...

  9. angularjs获取参数方法

    链接:/tab/newsview?id=58 .controller('NewsViewCtrl', ["$scope", "$location"," ...

  10. [BZOJ4016][FJOI2014]最短路径树问题

    [BZOJ4016][FJOI2014]最短路径树问题 试题描述 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长 ...