较为复杂的动态规划整理

来源:互联网 发布:禁止 网络医疗平台 编辑:程序博客网 时间:2024/04/30 07:46

一、POJ 1191 棋盘分割

化简均方差的公式后发现,均方差的平方=(1/n)*(n个矩形总分平方的和)-平均值的平方。

f[k][x1][y1][x2][y2]表示将左上角坐标为(x1,y1)右下角坐标为(x2,y2)的矩形分割k次得到的总分平方和的最小值。

s[x1][y1][x2][y2]表示矩形(x1,y1)(x2,y2)总分的平方。

t1=min(f[k-1][x1][a][x2][y2]+s[x1][y1][x2][a-1], f[k-1][x1][y1][x2][a-1]+s[x1][a][x2][y2]);(y1+1<=a<=y2)//横向切割

t2=min(f[k-1][a][y1][x2][y2]+s[x1][y1][a-1][y2], f[k-1][x1][y1][a-1][y2]+s[a][y1][x2][y2]);(x1+1<=a<=x2)//纵向切割

f[k][x1][y1][x2][y2]=min(t1,t2);


二、POJ 1054 The Troublesome Frog

首先将各点按坐标从小到大排序,使表示点的结构体在数组中按从左上到右下的顺序排列。

f[i][j]表示以j到i的长度为一步的距离,从场外跳跃到点i的最大步数。(j<i)

显然,以该跳跃方式跳跃,点j的前一点p的坐标为( a[j].x-(a[i].x-a[j].x) , a[j].y-(a[i].y-a[j].y) ),点i的下一点n的坐标为( a[i].x+(a[i].x-a[j].x) , a[i].y+(a[i].y-a[j].y) )。

当p在场内且f[j][p]有值时,f[i][j]=f[j][p]+1;当p在场外时,f[i][j]=2;表示经过了i和j两个点。当n在场外时,ans=max(ans,f[i][j]);表示下一步能跳出场外,此时f[i][j]即一条路径的点数。


三、POJ 3208 Cheapest Palindrome

分析可知,添加字母c和删除字母c均可以使字符串成为回文串,因此选择其中花费最小的,对添加字母和删除字母的花费进行预处理,使cost[c]=min(add,del);

f[i][j]表示使s[i]到s[j]成为回文串的最小花费。

当s[i]!=s[j]时,可以添加或删除字符s[i],此时花费为f[i+1][j]+cost[s[i]] (比如 "caba" c[i]='c' c[j]='a' ,花费为使"aba"变为回文串的最小花费+在右侧添加一个'c'或删除左侧的'c'的花费 ),同理也可以添加或删除字符s[j],此时花费为f[i][j-1]+cost[s[j]]。

当s[i]==s[j]时,f[i][j]=f[i-1][j-1];表示无额外花费。


四,POJ 2948 Martian Mining

由题目可以看出,点(i,j)中的矿物向北或向西运送时不能中断,若(i,j)向北运送,则(k,j)(k<i)皆向北运送,向西同理。

令nor[i][j]表示将矿物(1,2,3...i,j)运往北边和。wes[i][j]表示将矿物(i,1,2,3...j)运往西边的和。

fnor[i][j]表示将(i,j)运往北边,此时从矩形(1,1)(i,j)能得到的最大矿物数。fwes[i][j]表示将(i,j)运往西边,此时从矩形(1,1)(i,j)能得到的最大矿物数。

fnor[i][j]=nor[i][j]+max( fnor[i][j-1] , fwes[i][j-1] );      fwes[i][j]=wes[i][j]+max( fwes[i-1][j] , fnor[i-1][j] );

ans=max( fnor[n][m] ,fwes[n][m] );


五,POJ 1925 Spiderman

Spiderman, Spiderman,  
Does whatever a spider can  
Spins a web, any size,  
Catches thieves just like flies  
Look Out!  
Here comes the Spiderman.  

=_= 一不小心就唱起来了

发现小虫每次跳跃前后横坐标是不变的。

令f[j]表示小虫荡到点i时的最小跳跃次数。

若以楼i为中心跳跃的话,小虫可以从区间j={k,x[i]-1}起跳,终点为x[i]*2-j,计算可知,(x[i]-k)*(x[i]-k)+(y[i]-y[1])*(y[i]-y[1])==y[i]*y[i]。

所以f[x[i]*2-j]=min(f[x[i]*2-j], f[j]+1);最后从x[n]<=i<=x[n]*2中找最小的f[i]即可。


六,POJ 3034 Whac-a-Mole

f[k][i][j]表示时间为k时锤子停在点(i,j)的情况下得到的最多分值,注意锥子可以落到场地外,而且锥子移动的直线上所有mole都会受到攻击-_-#(即(1,2)到(4,8),(2,4)(3,6)上的mole也会受到攻击)。

注意锤子的移动范围为d,即k-1时间锤子的位置(x,y)与k时间锤子的位置(i,j)的距离不能超过d。

原创粉丝点击