杭电动态规划23题

1.:http://acm.hdu.edu.cn/showproblem.php?pid=2955

这题傻逼的认为了是裸地01背包,正确的动态方程:dp[i]=dp[i-v[i]]*(1-p[i]); dp[i]表示抢i元最大的不被抓到的概率。应为这题每次抢都是相互独立的,所以可以相乘,必须是不被抓到的概率相乘。

代码:http://blog.csdn.net/qq415200973/article/details/11950813

2.:http://acm.hdu.edu.cn/showproblem.php?pid=1864

比较水的01背包,花费被隐藏了。这题有trick,wa了两发,单件物品不能超过600呀,总共有三种单件物品。

代码:http://blog.csdn.net/qq415200973/article/details/11951767

3.:http://acm.hdu.edu.cn/showproblem.php?pid=1231

最长连续字段和,不多说。

4:http://acm.hdu.edu.cn/showproblem.php?pid=1003

同上。

5:http://acm.hdu.edu.cn/showproblem.php?pid=1506

这题和求最大矩阵的面积差不多,维护两个数组,l[i],r[i]。答案为max{(h[i]*(r[i]-l[i]+1))};

主要是更新l[i],r[i]有点技巧:

if(a[i]>a[i-1])
            {
                l[i]=i;
                continue;
            }
            int j=i-1;
            while(a[j]>=a[i])
            {
                j=l[j]-1;
            }
            l[i]=j+1;

6: http://acm.hdu.edu.cn/showproblem.php?pid=1505

这题在白书上已经做过,就不在重复了,这题是1506的二维的情况,这题得维护三个数组l[i][j],r[i][j],up[i][j],答案是max{up[i][j]*(r[i][j]-l[i][j]+1)};

具体看代码:http://blog.csdn.net/qq415200973/article/details/11377199

7:http://acm.hdu.edu.cn/showproblem.php?pid=2602

太水,不多说。

8:http://acm.hdu.edu.cn/showproblem.php?pid=2571

比较水的dp,注意下初始化就行。

9:http://acm.hdu.edu.cn/showproblem.php?pid=1069

就是放箱子问题吧,上面的箱子的长和宽要小于下面的。

dp[i]=max{dp[j]}+v[i];x[i]<x[j],y[i]<y[j];

注意下就是每个箱子可以有三种方法,只要开三倍的数组存就行了。

10:http://acm.hdu.edu.cn/showproblem.php?pid=1176

线段上的dp,比较水,状态就两种。

11:http://acm.hdu.edu.cn/showproblem.php?pid=1421

这题还是从后面开始吧,判断最后一个东西取不取。

dp[i][j]表示前i个物品,取j组的最小值。

i==2*j  dp[i][j]=dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]);

i>2*j dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]);

12:http://acm.hdu.edu.cn/showproblem.php?pid=1058

数组的顺序性。如果一个数i是Humble Number 那么2*i,3*i,5*i,7*i也是Humble Number。

这里用四个指针分别能遍历每个Humble Number的2,3,5,7倍。而且,模拟一下也不会出现重复的。

核心代码: 

    a[1]=1;
    int p1,p2,p3,p4;
    p1=p2=p3=p4=1;
    for(int i=2;i<6666;i++)
    {
        a[i]=min4(a[p1]*2,a[p2]*3,a[p3]*5,a[p4]*7);
        if(a[i]==a[p1]*2) p1++;
        if(a[i]==a[p2]*3) p2++;
        if(a[i]==a[p3]*5) p3++;
        if(a[i]==a[p4]*7) p4++;
    }
13: http://acm.hdu.edu.cn/showproblem.php?pid=1789

贪心的想法,不过想了一会儿没想出来,一开始只知道是按值从大到小排序,后来就不知道怎么弄了。每个应该尽可能放到最后面,因为这样才不会影响其他的任务。

14:http://acm.hdu.edu.cn/showproblem.php?pid=1978

水dp

15:http://acm.hdu.edu.cn/showproblem.php?pid=1114

这题是完全背包,注意两点:

1.求恰好装满 f[0]=0 其他设为INF

2.求最小值  用min

16:http://acm.hdu.edu.cn/showproblem.php?pid=1024

这题卡时间和内存,必须用滑动数组,另外还要用一个数组记录。dp[i][j]表示前i个数字组成k组的最大和,这里必须以i 结尾。

动态方程: dp[i][j]=max(dp[i-1][j],dp[k][j)+a[i];第i个可以单独成段,也可以加到前面最大的那一段中

代码:http://blog.csdn.net/qq415200973/article/details/12250451

17:http://acm.hdu.edu.cn/showproblem.php?pid=1158

这题还是用二维的dp枚举所有的情况,可能雇员,裁员,人数不变,找到人数变化的范围。

18:http://acm.hdu.edu.cn/showproblem.php?pid=1074

这题用到了状压dp,记录当前状态取哪些课程的最小花费,前一个状态,当前状态的最后一个课程,当前状态花费的时间。这种状压dp有多种数据,要开结构体存。

代码:http://blog.csdn.net/qq415200973/article/details/12273617

19:http://acm.hdu.edu.cn/showproblem.php?pid=1422

最大子段和变形。

20:http://acm.hdu.edu.cn/showproblem.php?pid=1227

在n个点中选k个点,求这n个点到最近的k个点中的某个点的距离之和最小。

这里同样只考虑最后一个点与前面的哪些点共用一个k中的某个点。

dp[i][j]=min{dp[i][j],dp[k-1][j-1]+get_cost(k,i)}    1<=k<=i;

代码:http://blog.csdn.net/qq415200973/article/details/12305673

21:http://acm.hdu.edu.cn/showproblem.php?pid=3008

这题一开始没什么思路,最后想到枚举时间和容量,瞬间思路就清楚了。

dp[i][j]表示在i秒,一开始有j的魔法值,对boss造成的最大伤害。

代码:http://blog.csdn.net/qq415200973/article/details/12339681

22:http://acm.hdu.edu.cn/showproblem.php?pid=1502

dp[i][j][k]分别记录A,B,C出现的次数。不过得用高进度来搞,Java水过。

代码:http://blog.csdn.net/qq415200973/article/details/12378291

23:http://acm.hdu.edu.cn/showproblem.php?pid=1503

最长公共子序列的变形,用两个单词构造出一个新的单词,能包含着两个单词。直接先求最长公共子序列的位置,然后按一定规律输出。

代码:http://blog.csdn.net/qq415200973/article/details/12648555


你可能感兴趣的:(杭电动态规划23题)