摘要: 双调欧几里得旅行商问题:http://blog.sina.com.cn/s/blog_51cea4040100gkcq.htmlf(i,j)表示第一个人走到i点,第二个人走到j点所行走的最短距离,前i个都已经走过。所以将要到达第i个点时,第i个点有可能交给第一个人,也有可能交给第二个人,两种情况下与f(i-1,j) 都有什么关系呢?第一种情况下:f(i,j)=min{f(i,j),f(i-1,j)+dist(i-1,i)};第二种情况下:f(i,i-1)=min{f(i,i-1),f(i-1,j)+dist(j,i)};(f(i,i-1)==f(i-1,i))代码如下:#include< 阅读全文
posted @ 2012-03-20 20:05 书山有路,学海无涯 阅读(611) 评论(0) 推荐(0) 编辑
摘要: Nyoj 61 传纸条前几天无意中看到多进程DP,原来我苦恼很长时间的传纸条问题竟然是双进程DP,搜了几篇大牛的关于双进程DP的文章,有些思路了:拿传纸条问题来说吧,其实就是找两条从左上角到右下角不相交的路径(除了头和尾),使路径上的和最大。因为路径不能相交,所以我们必须同时考虑两个人的位置,若两人的位置设为x1,y1, x2,y2,状态转移方程可以写成如下形式:f(x1,y1,x2,y2)=max{f(x1-1,y1,x2-1,y2),f(x1-1,y1,x2,y2-1),f(x1,y1-1,x2-1,y2),f(x1,y1-1,x2,y2-1)}+map[x1][y1]+map[x2][y 阅读全文
posted @ 2012-03-20 13:48 书山有路,学海无涯 阅读(436) 评论(0) 推荐(0) 编辑
摘要: 典型的背包问题,状态转移方程如下:res[i][j] 表示用i的忍耐度杀j个怪兽获得的最大经验值。res[i][j]=max(res[i-weight[k]][j-1]+value[k], res[i][j]);代码如下:#include<iostream>#include<cstdio>#include<cstring>using namespace std;int weight[101],value[101],res[101][101];int max(int a,int b){ return a > b ? a : b;}int work(int 阅读全文
posted @ 2012-03-20 13:16 书山有路,学海无涯 阅读(177) 评论(0) 推荐(0) 编辑