HDU 动态规划(46道题目)倾情奉献~ 【只提供思路与状态转移方程】
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].money]*q[i].v) 其中,f[j]表示抢j块大洋的最大的逃脱概率,条件是f[j-q[i].money]可达,也就是之前抢劫过;
始化为:f[0]=1,其余初始化为-1 (抢0块大洋肯定不被抓嘛)
最大报销额 http://acm.hdu.edu.cn/showproblem.php?pid=1864
又一个背包问题,对于每张发票,要么报销,要么不报销,0-1背包,张数即为背包;
转移方程:f[j]=max(f[j],f[j-1]+v[i]);
恶心地方:有这样的输入数据 3 A:100 A:200 A:300
最大连续子序列 http://acm.hdu.edu.cn/showproblem.php?pid=1231
状态方程:sum[i]=max(sum[i-1]+a[i],a[i]);最后从头到尾扫一边
也可以写成:
Max=a[0];
Current=0;
for(i=0;i<n;i++)
{
if(Current<0)
Current=a[i];
else
Current+=a[i];
if(Current>Max)
Max=Current;
}
max sum http://acm.hdu.edu.cn/showproblem.php?pid=1003
同上,最大连续子序列
Largest Rectangle http://acm.hdu.edu.cn/showproblem.php?pid=1506
对于每一块木板,Area=height[i]*(j-k+1) 其中,j<=x<=k,height[x]>=height[i];找j,k成为关键,一般方法肯定超时,利用动态规划,如果它左边高度大于等于它本身,那么它左边的左边界一定满足这个性质,再从这个边界的左边迭代下去
for(i=1;i<=n;i++)
{
while(a[l[i]-1]>=a[i])
l[i]=l[l[i]-1];
}
for(i=n;i>=1;i--)
{
while(a[r[i]+1]>=a[i])
r[i]=r[r[i]+1];
}
City Game http://acm.hdu.edu.cn/showproblem.php?pid=1505
1506的加强版,把2维转换化成以每一行底,组成的最大面积;(注意处理连续与间断的情况);
Bone Collector http://acm.hdu.edu.cn/showproblem.php?pid=2602
简单0-1背包,状态方程:f[j]=max(f[j],f[j-v[i]]+w[i])
Super Jumping http://acm.hdu.edu.cn/showproblem.php?pid=1087
最大递增子段和,状态方程:sum[j]=max{sum[i]}+a[j]; 其中,0<=i<=j,a[i]<a[j]
命运http: