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;
这题在白书上已经做过,就不在重复了,这题是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