摘要:动态规划是一个重点 但是从来还没有系统的练习过,下面HDU上的46道DP题和其状态转移方程,等以后练习使用这是从百度文库下载的 不知道原作者。。。1.Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱 最脑残的是把总的概率以为是抢N家银行的概率之和… 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋);正确的方程是:f[j]=max(f[j],f[j-q[i].m
阅读全文
摘要:题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1733初始化时,需要计算所有的f[0][i] 和 f[i][0] , 状态转方程是 f[i][j]= if (a[i]==b[j] ) f[i-1][j-1]+1 else max(f[i-1][j],f[i][j-1]) 数组开大一点· 【100】【100】 是错了的代码:#include #includeusing namespace std;int f[1000][1000];int max(int a,int b){ if(a>b) re
阅读全文
摘要:题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2136经典DP,划分为这样的子问题: 记录 length【k】为,以ak为最后一个元素的最长上升子序的长度,那么求这个值时,只需要取出这个数之前的比它小的数,看它的length是多少,取出有最大的length那个。m记录的是之前子问题的length,初始化为0。这样实现的结果就是,有length【0】就可以求出length【1】,接着可以求出length【2】......。这样暴力是 O(2^n)的问题(所有的子集都拿出来考察)就变成O(n^2)了最后的结果是所
阅读全文
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1003#include #include#includeusing namespace std;int main(){ //ifstream cin("testdata.txt"); int n=0; cin>>n; for(int l=0;l>size; int *p=new int[size]; for(int i=0;i>p[i]; int begin=0; int end=0; ...
阅读全文