标签:code contest 请求 out 三个点 can service 文件 www
设计状态,令f[w][i][j][k]为处理完第w个请求后,三辆车分别在i\j\k三个点的最小耗油量
因为一定有一辆车正好停在点a[w],所以省掉一维空间,得到f[w][i][j]
因为这样做数组太大会超时(有一定联系),考虑每一次都由上一个请求转移到下一个请求,把w优化成滚动维
最后转移一下就行了
#include <stdio.h> #include <memory.h> #define MaxN 1001 #define MaxM 201 #define dmin(a,b) ((a)<(b)?(a):(b)) int g[MaxM][MaxM],a[MaxN],m,n,f[2][MaxM][MaxM],T,ans=0x3f3f3f3f; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&g[i][j]); while(scanf("%d",&a[++m])!=EOF); memset(f,0x3f,sizeof f); f[T][1][2]=f[T][2][1]=g[3][a[1]]; f[T][2][3]=f[T][3][2]=g[1][a[1]]; f[T][1][3]=f[T][3][1]=g[2][a[1]]; for(int k=2;k<m;k++){ T^=1; memset(f[T],0x3f,sizeof f[T]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ f[T][i][j]=f[T][j][i]=dmin(f[T][i][j],f[T^1][i][j]+g[a[k-1]][a[k]]); f[T][a[k-1]][j]=f[T][j][a[k-1]]=dmin(f[T][a[k-1]][j],f[T^1][i][j]+g[i][a[k]]); f[T][a[k-1]][i]=f[T][i][a[k-1]]=dmin(f[T][a[k-1]][i],f[T^1][i][j]+g[j][a[k]]); } } for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)ans=dmin(ans,f[T][i][j]); printf("%d\n",ans); return 0; }
[bzoj1820][JSOI2010][Express Service 快递服务] (动态规划)
标签:code contest 请求 out 三个点 can service 文件 www
原文地址:http://www.cnblogs.com/keshuqi/p/6344939.html