hdu 2993 MAX Average Problem
这题都整死我了,代码基本上和别人AC的都快一样了还是不对。郁闷死了快。。最后终于发现了错误点自判断斜率时y1*x2 <= y2*x1 如果用整型就会超数据类型肯定会错,而上边的用整型可以过,不过最好用实型因为毕竟k的大小不确定。。。这题的详细解释 例2 这里在转到0-n个点求斜率的时候不好理解。
数形结合以形住树。
View Code #include #include #include #include #include #include #include #include #include
hdu 3507 Print Article
题意:
给定长度为n的整数序列,![](http://acm.hdu.edu.cn/data/images/3507-1.jpg)
对他进行划分,每一段的花费为上述公式:假设从i到j为一段划分则花费为 (∑Ck)^2 + m , i<=k<=j。求一个划分使花费最小。
思路:
这里参考别人的思路,给出个人感觉讲解比较好的连接:
代码参考:
View Code #include #include #include #include #include #include #include #include #include
hdu 3408 Division
题意:
给你一个含有n个数的集合,让你划分成M个子集,每个集合里面的(MAX - MIN)^2为这个集合的花费,求总的花费最小。
思路:
首先我们要经整体排序
我们可以得到状态转移方程dp[i][j]表示以j结尾将序列划分成i块的最小花费则有dp[i][j] = min(dp[i - 1][k] + (a[j] - a[k + 1])*(a[j] - a[k + 1]));这样求的话复杂度O(n*m*m)肯定会超时。所以要优化,我们把方程拆开得到dp[i][j] = dp[i - 1][k] + a[j]^2 + a[k + 1]^ - 2*a[j]*a[k + 1];令y = dp[i - 1][k] + a[k + 1]^2 ; x = a[k + 1].
得到 dp[i][j] = y - 2*a[j]*x + a[j]^2;
则套用斜率优化即可。
View Code #include #include #include #include #include #include #include #include #include
hdu 4258 Covered Walkway
和上边的两道题目基本上一样,都是划分的题目。
题意:
给你x坐标上的n个点,让你让你两点连线将所有点覆盖,假设我们在a[i]到a[j]连线,则i-j的点都已经覆盖并且这一段的费用为(j - i)^2,求把所有点覆盖后的最小花费。
思路:
由题可得状态转移方程dp[i] = min(dp[j] + (a[i] - a[j + 1])^2 + c) (1<=j < i) 将方程展开后记得
dp[i] = dp[j] + a[j + 1]^2 + a[i]^2 - 2*a[i]*a[j + 1] + c; 令y = dp[j] + a[j + 1]^2 ; x = a[j + 1]; 则有dp[i] = y - 2*a[i]*x + a[i]^2 + c;
套用斜率优化即可。注意数据类型的处理,这里因为超了数据类型错了一次。
View Code #include #include #include #include #include #include #include #include #include
hdu 2829 Lawrence
基本上和上几个题类似:
题意:
Lawrence要建一条铁路,铁路包括一些收费站(这里描述为一些点,对应着有自己的vale),还有连接两点的线,这条铁路的花费计算方法为:
![](http://acm.hdu.edu.cn/data/images/2829-1.jpg)
4*5 + 4*1 + 4*2 + 5*1 + 5*2 + 1*2 = 49.
由于资金材料的限制只能毁掉一些线,使的耗费减小.给定n个点,以及要炸掉m个边求如何炸才能得到最小耗费,输出最小耗费。
思路:
首先我们得到状态转移方程dp[i][j]表示以i结尾炸掉j条路线的最小耗费。则有
dp[i][j] = min(dp[k][j - 1] + cost[k + 1][i]) (1<=k<i). cost[i][j]表示i到j这串数字的乘积和,sum[i]表示1到i为止这些数字的和
cost[1][i] = cost[1][k] + cost[k + 1][i] + sum[k]*(sum[i] - sum[k]);
==>cost[k+1][i]=cost[1][i]-cost[1][k]-sum[k]*(sum[i]-sum[k])
==>dp[i][j]=dp[k][j-1]+cost[1][i]-cost[1][k]-sum[k]*(sum[i]-sum[k])
==>dp[k][j-1]-cost[1][k]+sum[k]^2-sum[i]*sum[k]+cost[1][i]
==>由于sum[i]是与i有关的常量,所以很明显,斜率k=sum[i],
设y=dp[k][j-1]-cost[1][k]+sum[k]^2
那么dp[i][j]=y-k*x+cost[1][i]
到这一步就可以套用斜率优化了。
View Code #include #include #include #include #include #include #include #include #include