今天是在结束初赛后的第二天,也是我正式开始冲刺复赛的第一天。
进入冲刺网站后的第一个任务是办完DP的题。
第一题:1239
这道题中提示已经非常充足了,但正是因为提示,我缺少了自己的思考(完全照提示的公式抄),导致多次错误。最终还是解决了这道题。
AC代码:
第二题:1240
这道题也是给出了公式,套上原来模板(1238就相当于一个模板)即可。
理论上记忆化搜索与普通DP时间复杂度相同,但实际上记忆化搜索会超时(不能相信提示)。
超时代码:
AC代码:
第三题:1241
这道题下面提示没给公式,但做完1238-1240三道题后,我已经可以在不看提示的情况下写出公式来了。
如果设a[i]为第i颗珠子的头标记,a[i+1]为其尾标记,同时也是第i+1颗珠子的头标记,
f[i][j]为将i到j合并成一颗珠子所获得的能量,
则f[i][j]=f[i][k]+f[k+1][j]+a[i]*a[j+1]*a[k+1],其中i≤k<j。
破环为链后a[i+n]=a[i],求的是f[i][i+n-1],其中1≤i≤n。
AC代码:
第四题:1242
前面的题目都是复杂度为O(n3)的区间DP,这道题却是一个线性DP。
我的思路:
设f[i][j]表示电线杆i的高度为j时前i根电线杆的建设最少需要消耗的钱数,h表示最高的电线杆的高度
则f[i][j]=min(f[i][j],f[i-1][k]+(j-h[i])2+c*abs(j-k)),其中h[i-1]≤k≤h
边界条件:f[1][h[1]]=0,f[1][h[1]+n]=n2
时间复杂度:
外循环按顺序枚举每一根电线杆O(n),第二层循环枚举第i根的高度O(h),第三层循环分别使用第i-1根的h种高度更新第i根的钱数O(h),时间复杂度为O(nh2)。
在这道题中O(nh2)的时间复杂度相当于1010级别,理论上通过不了。但由于数据太水还是通过了。
代码: