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

Posted AlvinZH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n", ans);
    }
}

以上是关于2016级算法第三次上机-A.Bamboo的小吃街的主要内容,如果未能解决你的问题,请参考以下文章

2016级算法第四次上机-A.Bamboo 和人工zz

2016级算法第三次上机-C.AlvinZH的奇幻猜想——三次方

2016级算法第三次上机-F.ModricWang的导弹防御系统

2016级算法第三次上机-G.Winter is coming

2016级算法第三次上机-D.双十一的抉择

2016级算法第三次上机-B.Bamboo和巧克力工厂