动态规划专题:beginner

UVa 11584:看了这道题我才知道我的思维有多弱……纠结了好久……

          状态转移方程:d[i]=min{d[j-1]+1|str[j-->i]为回文串}。

 

LA4256:水题一道,可我又搞了半天!就因为少记录了一维!

        状态转移方程为:d[i][u]=min{d[i+1][v]|u,v相连},如果u!=原串的第i个数,再加上1。

 

UVa 10534:直接转化成求LIS。先求正向的LIS,再求逆向的,然后综合一下就可求出结果。

 

UVa 11552:用d[i][ch]表示到第i组以ch结尾的最小分组情况。由题意易知每组相同的元素必然相连,唯一需要注意的是组内元素全部相等的情况。

 

UVa 11404:如果不需要找字典序最小的结果的话,这题直接求原串和逆串的LCS即可。可是要记录路径就麻烦了,结果越做越烦,最后就直接去搜题解了。搜了题解发现别人是把每个回文串记录下来,然后分回文串字符的奇偶性把字典序最小的找出来。然后我就参考别人的代码写了一遍。

 

UVa 11795:算是状压DP的入门题吧,刚开始脑子不清楚,以为结果最大为2^n,用int果断WA,后来一想应该是全排列n!,改成long long就AC了。

 

LA 2038:基础的树形DP,是训练指南上例题30的简化版。

 

LA4731:题目奇长无比,冗余信息太多,要不是训练指南上有题目翻译,估计我就放弃了……

知道了题意就比较简单了,就是一道区间划分的DP。先贪心一下,把概率从大到

小排序,然后状态转移方程为:

dp[i][zone]=min{dp[u][zone+1]+u*sump[i+1-->u]|i<u<=n}。

因为n比较小,直接O(n^2)是完全没问题的。

 

UVa 10817:基础的状压DP,因为s<=8,所以我就用两个2进制位来表示每门课至少要有

         2个老师。

         状态转移方程:dp[i][s]=min{dp[i+1][s],dp[i+1][s’]+cost[i]}。

 

UVa 10564:需要记录路径的DP,类似0-1背包,只不过需要记录3维状态,即第几层的几个以及背包容量。DP完了之后,可以直接推出路径,不需要再记录路径。不过这题我WA了多次,虽然数据规模很小,不过计数问题即使数据规模较小,在极端情况下最后的结果可能还是很大,所以得用long long。这一点以后需要注意。

 

LA 3530:不知道为什么这题跑的这么挫……第一次TLE,然后改了改,1.668s勉强过了……状态转移方程不是太难想,需要贪心一下,因为要求最大值,所以可以这样设置状态转移方程:dp[i][pre]=max{dp[i+1][pre’]+sum_yey[1-->pre’]+sum_blo[pre’+1-->m]|pre’>=pre}。

         第一维i表示前i行,第二维pre表示前i-1行东西向轮子的最大值。

 

LA 4727:建3个dp数组分别存储jump(i,k){3<=i<=n}的最后3个数。然后先算出当n为3的情况,然后递推就可以了。递推公式为dp[i]=(dp[i-1]+1+(k-1)%i)%i,这里为了方便我把数从0开始记,最后只要在结果上加1就行了。

 

LA 3363:这道题WA惨了……一开始状态方程设计的就很挫,后来又发现题目没读清楚,然后又各种小错误,弄了整整一晚上!其实这题还是比较简单的,关键是一开始的时候想法就出错了,其实从可以嵌套就可以很自然的想到用d[i][j]表示从i到j压缩后的最小长度。这样状态方程就不难得出了:

         d[i][j]=min{d[i][i+k-1]+d[i+p*k][j]+(p==1?0:2+digits)|k为周期,p为以k为周期的串的重复次数}。

 

UVa 10453:看到和回文串有关的题,就想直接转化成LCS的方法来做,结果这样做会异常的烦,最后又因为数据较强,直接TLE了。搜了解题报告才知道求一段字符串内最大回文串的更好的方法:

dp[i][j]=dp[i+1][j-1],if(str[i]==str[j]);

dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1),otherwise。

这里dp[i][j]表示的是i到j不构成回文串的最小字符数。然后这道题需要还原成回文串,在决策时记录状态p[i][j]。然后递归打印就可以了,这样不仅时间效率很高,而且代码也很优美……可是我怎么就想不到呢,水人就只能写搓代码啊!

 

LA2031:感觉这题很水,状态方程显然:

dp[i][l][r]=min{dp[i+1][dir[i]][r]+cost[dir[i]][l],dp[i+1][l][dir[i]]+cost[dir[i]][r]}

其中当dir[i]在左时不能与r相同;dir[i]在右时不能与l相同。

 

LA 4643:这题纠结了很久,刚开始状态没有搞清楚,貌似状态方程没有满足无后效性,然后就一直连样例都过不了。然后搜了下解题报告,看了好久才看懂。

        总结了一下就是一维是所选择的的问题的集合,另一维是问完问题后的状态。如果对所有object问完所有问题,只有一个以下的object满足状态,那么该状态的dp值为0,否则

dp[query][state]=min{max(dp[query+{j}][state],dp[query+{j}][state+{j}])+1}

j不属于query。说实话,这么想还是不是很直观,额,不知道是不是我想的有问题。思维是硬伤啊!

 

UVa 10163:今天做题状态真是差啊……WA了几次就没心思思考了……

          其实还是比较容易的一道题,就是两次dp就行了。先求出Lmax,再通过Lmax求Ymin。

          状态转移方程:

          dp_L[i][j]=max(dp_L[i-1][j],min(dp_L[i-1][k],p[i]/(j-k))|k<j);

         dp_Y[i][j]=min(dp_Y[i-1][j],dp_Y[i-1][k]+p[i]|k<j&&p[i]/(j-k)>=Lmax)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值