Estrella's Travel

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liar771/article/details/53747899

Estrella's Travel

题目描述

Estrella喜欢旅行,她准备去自己心仪的城市看风景。她精心选择了一条线路,准备自驾游。自驾线路是一条链路,上有n+1座城市,编号依次为0n,Estrella住在0号城市,目的地是n号城市。Estrella为了环保,驾驶了一辆纯电动车,所以最多只能一次行驶m个城市的距离。如果Estrella在某个城市(包括n号城市)停留,自然会需要一些费用,当然每个城市的花费是不一样,Estrella想知道,这个花费最小是多少?

输入

多组数据输入。
每组数据第一行两个整数n(1<n<1000),m(1m<n)
第二行n个整数ai(0<ai1000),表示编号为1,2,,n的城市的停留花费。

输出

对于每个数据,输出一行,表示总的花费。

样例输入

5 2
1 2 3 4 5
6 2
6 5 4 3 2 1

样例输出

9
9

样例解释

第1个样例,依次到城市1,3,5,所以花费为1+3+5=9;
第2个样例,依次到城市2,4,6,所以花费为5+3+1=9。


来源:湘潭大学2016年新生趣味程序设计竞赛,Si Haiyang http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1257

动态规划dp[i]=min{dp[i-m]~dp[i-1]}+a[i];

记录从1~n个城市的最小消费,到后一个城市的最小消费,由前m个可直达城市最小消费加上自身消费得出。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m,i,j,a[10086],dp[10086];
    while(~scanf("%d%d",&n,&m))
    {
        dp[0]=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            int minn=dp[i-1];
            for(j=max(i-m,0);j<i;j++)
            {
                minn=min(minn,dp[j]);
            }
            dp[i]=minn+a[i];
        }
        printf("%d\n",dp[n]);
    }
}




猜你喜欢

转载自blog.csdn.net/liar771/article/details/53747899