[tyvj-1061]Mobile Service 动态规划

滚动数组优化一波。
原设计状态:表示三个员工分别的位置和执行到的任务。
考虑到:执行完第i个任务,一定有员工在pos[i],那么就可以压一维,空间复杂度就算不滚动数组也可以了。
(喜闻乐见,今天第一次)1A

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int l,n,g[305][305],a[1005],f[2][205][205];
int main() {
	scanf("%d%d",&l,&n);
	for(int i=1; i<=l; i++)
		for(int j=1; j<=l; j++)
			scanf("%d",&g[i][j]);
	for(int i=1; i<=n; i++) scanf("%d",&a[i]);
	memset(f,0x3f,sizeof f);
	f[0][1][2]=0;
	a[0]=3;
	for(int k=0; k<n; k++) {
		for(int i=1; i<=l; i++)
			for(int j=1; j<=l; j++)
				f[k+1&1][i][j]=min(f[k+1&1][i][j],f[k&1][i][j]+g[a[k]][a[k+1]]),
				f[k+1&1][a[k]][j]=min(f[k+1&1][a[k]][j],f[k&1][i][j]+g[i][a[k+1]]),
				f[k+1&1][i][a[k]]=min(f[k+1&1][i][a[k]],f[k&1][i][j]+g[j][a[k+1]]);
		memset(f[k&1],0x3f,sizeof f[0]);
	}
	n&=1;
	int ans=1<<30;
	for(int i=1; i<=l; i++)
		for(int j=1; j<=l; j++)
			ans=min(ans,f[n][i][j]);
	printf("%d",ans);
}
posted @ 2018-07-08 01:14  SWHsz  阅读(196)  评论(0编辑  收藏  举报