bzoj 3892: [Usaco2014 Dec]Marathon 动态规划
2016-12-23 22:12
453 查看
题意
在二维平面上有N个点,从(x1,y1)到(x2,y2)的代价为|x1-x2|+|y1-y2|。求从1号点出发,按从1到N的顺序依次到达每个点的最小总代价。你有K次机会可以跳过某个点,不允许跳过1号点或N号点。n<=500
分析
一开始想的是各种网络流费用流之类的,后来发现只要一个dp即可。f[i,j]表示从点1到达点i跳过了j个点的最短距离
f[i,j]=min(f[k,j-i+1+k]+dist[k,i])
代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define N 505 #define inf 0x3f3f3f3f using namespace std; int n,m,x[N],y[N],dist[N][N],f[N][N]; int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]); for (int i=1;i<n;i++) for (int j=i+1;j<=n;j++) dist[i][j]=dist[j][i]=abs(x[i]-x[j])+abs(y[i]-y[j]); memset(f,inf,sizeof(f)); f[1][0]=0; for (int i=2;i<=n;i++) for (int j=0;j<=min(m,i-2);j++) for (int k=i-1;k>=1&&j-i+1+k>=0;k--) f[i][j]=min(f[i][j],f[k][j-i+1+k]+dist[k][i]); printf("%d",f [m]); return 0; }
相关文章推荐
- BZOJ 3892 [Usaco2014 Dec]Marathon 动态规划
- BZOJ 3892 Usaco2014 Dec Marathon DP
- 3892: [Usaco2014 Dec]Marathon
- bzoj 3825: [Usaco2014 Dec]Marathon
- bzoj 3824: [Usaco2014 Dec]Guard Mark【状压dp】
- 【动态规划】bzoj1649 [Usaco2006 Dec]Cow Roller Coaster
- bzoj3892: [Usaco2014 Dec]Marathon
- 【BZOJ1672】[Usaco2005 Dec]Cleaning Shifts 清理牛棚 动态规划
- BZOJ 3893 [Usaco2014 Dec]Cow Jog
- BZOJ 3893 [Usaco2014 Dec]Cow Jog
- 【BZOJ3892】【Usaco2014 Dec】Marathon (Silver and Bronze) 暴力动规
- bzoj3893【Usaco2014 Dec】Cow Jog
- [bzoj3893][Usaco2014 Dec]Cow Jog_暴力
- BZOJ3825 : [Usaco2014 Nov]Marathon
- BZOJ 3893 Usaco2014 Dec Cow Jog 模拟
- BZOJ 1606: [Usaco2008 Dec]Hay For Sale 购买干草(动态规划)
- BZOJ 3891 USACO 2014 Dec Piggy Back 搜索 最短路
- BZOJ 3891 Usaco2014 Dec Piggy Back BFS
- bzoj 3893: [Usaco2014 Dec]Cow Jog 并查集+单调队列
- 【BZOJ3893】【Usaco2014 Dec】金组 Runing Cow