• 2016级算法第三次上机-A.Bamboo的小吃街


    A Bamboo的小吃街

    分析

    经典的两条流水线问题,题目描述基本类似于课件中的流水线调度,符合动态规划最优子结构性质
    关键的动态规划式子为:
    dp[0][j] = min(dp[0][j - 1], dp[1][j - 1] + t[1][j - 1]) + p[0][j] //保存在左边第j个店铺时已经用的时间
    dp[1][j] = min(dp[1][j - 1], dp[0][j - 1] + t[0][j - 1]) + p[1][j] //保存在右边第j个店铺时已经用的时间
    即到达i边第j个店铺,可以从i边第j-1个店铺过来,也可以从另一边的j-1个店铺过来,后者需要加上过马路的时间;两者都要加上在第i边第j个店铺停留的时间
    最后比较dp[0][n-1]和dp[1][n-1],找到最小值即为所求。

    循环店铺数,同时更新两边的时间。

    伪代码

    dp[2][maxx]
    p[2][maxx]
    t[2][maxx]
    //dp[0][j]  在左边第j家店时已经用的时间  
    //p t 如题所示  
    dp[0][0]=p[0][0]
    dp[1][0]=p[1][0]
    for j=1:n
        dp[0][j] = min(dp[0][j - 1], dp[1][j - 1] + t[1][j - 1]) + p[0][j]
    	dp[1][j] = min(dp[1][j - 1], dp[0][j - 1] + t[0][j - 1]) + p[1][j]
    end
    取两者中较小者
    
    

    代码

    const int maxx = 510;
    int dp[2][maxx];
    int p[2][maxx];
    int t[2][maxx];
    int main()
    {
    	int n;
    	while (~scanf("%d", &n))
    	{
    		memset(dp, 0, sizeof(dp));
    		int i, j;
    		for (i = 0; i<2; i++)
    			for (j = 0; j<n; j++)
    				scanf("%d", &p[i][j]);
    		for (i = 0; i<2; i++)
    			for (j = 0; j<n - 1; j++)
    				scanf("%d", &t[i][j]);
    
    		dp[0][0] = p[0][0];
    		dp[1][0] = p[1][0];
    		for (j = 1; j<n; j++)
    		{
    			dp[0][j] = min(dp[0][j - 1], dp[1][j - 1] + t[1][j - 1]) + p[0][j];
    			dp[1][j] = min(dp[1][j - 1], dp[0][j - 1] + t[0][j - 1]) + p[1][j];
    		}
    		long long  ans = dp[0][n - 1]<dp[1][n - 1] ? dp[0][n - 1] : dp[1][n - 1];
    		printf("%lld
    ", ans);
    	}
    }
    
  • 相关阅读:
    分享几个python小脚本
    关于python编译的一点小结
    一位测试工程师工作一年的心得体会
    Zookeeper知识梳理
    Kafka知识梳理(转载)
    霍夫曼编码压缩算法(转载 -- www.uusystem.com)
    表、栈和队列
    Python3正则表达式清洗Excel文档
    MongoDB学习笔记
    Centos--Docker应用
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/7977866.html
Copyright © 2020-2023  润新知