zoukankan      html  css  js  c++  java
  • tyvj 1061 Mobile Service

    线性DP

    本题的阶段很明显,就是完成了几个请求,但是信息不足以转移,我们还需要存储三个服务员的位置,但是三个人都存的话会T,我们发现在阶段 i 处,一定有一个服务员在 p[i] 处,所以我们可以只存另外两个人的位置,而且本题要滚动数组,采用刷表法比较好

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    int init() {
    	int rv = 0, fh = 1;
    	char c = getchar();
    	while(c < '0' || c > '9') {
    		if(c == '-') fh = -1;
    		c = getchar();
    	}
    	while(c >= '0' && c <= '9') {
    		rv = (rv<<1) + (rv<<3) + c - '0';
    		c = getchar();
    	}
    	return rv * fh;
    }
    int c[205][205], n, dp[2][205][205], p[2005], ans = 0x3f3f3f3f, q;
    int main() {
    	n = init(); q = init();
    	for(int i = 1; i <= n; i++) {
    		for(int j = 1; j <= n; j++) {
    			c[i][j] = init();
    		}
    	}
    	for(int i = 1; i <= q; i++) p[i] = init();
    	memset(dp, 0x3f, sizeof(dp));
    	p[0] = 1;
    	dp[0][2][3] = 0;
    	dp[0][3][2] = 0;
    	for(int i = 0; i < q; i++) {
    		for(int j = 1; j <= n; j++) 
    			for(int k = 1; k <= n; k++) 
    				dp[!(i & 1)][j][k] = 0x3f3f3f3f;
    		for(int j = 1; j <= n; j++) {
    			for(int k = 1; k <= n; k++) {
    				dp[!(i & 1)][j][k] = min(dp[!(i & 1)][j][k], dp[i & 1][j][k] + c[p[i]][p[i + 1]]);
    				dp[!(i & 1)][p[i]][k] = min(dp[!(i & 1)][p[i]][k], dp[i & 1][j][k] + c[j][p[i + 1]]);
    				dp[!(i & 1)][j][p[i]] = min(dp[!(i & 1)][j][p[i]], dp[i & 1][j][k] + c[k][p[i + 1]]);
    			}
    		}
    	}
    	for(int i = 1; i <= n; i++) {
    		for(int j = 1; j <= n; j++) {
    			ans = min(ans, dp[(q & 1)][i][j]);
    		}
    	}
    	cout << ans << endl;
    	return 0;
    }
    
  • 相关阅读:
    python 读写文件
    python之创建文件写入内容
    python之生成随机密码
    python实例七
    python 实例六
    python 实例四
    python实例二
    python实例一
    【BZOJ】1610: [Usaco2008 Feb]Line连线游戏
    【BZOJ】1602:[Usaco2008 Oct]牧场行走
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8582995.html
Copyright © 2011-2022 走看看