魔法少女

来源:互联网 发布:mac vi保存退出 编辑:程序博客网 时间:2024/04/27 15:42

魔法少女

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述
前些时间虚渊玄的巨献小圆着实火了一把。 在黑长直(小炎)往上爬楼去对抗魔女之夜时,她遇到了一个问题想请你帮忙。 因为魔女之夜是悬浮在半空的,所以她必须要爬楼,而那座废墟一共有n层,而且每层高度不同,这造成小炎爬每层的时间也不同。不过当然,小炎会时间魔法,可以瞬间飞过一层或者两层[即不耗时]。但每次瞬移的时候她都必须要至少往上再爬一层(在这个当儿补充魔力)才能再次使用瞬移。爬每单位高度需要消耗小炎1秒时间。 消灭魔女之夜是刻不容缓的,所以小炎想找你帮她找出一种最短时间方案能通往楼顶。
输入
本题有多组数据,以文件输入结尾结束。
每组数据第一行一个数字N(1 <= N <= 10000),代表楼层数量。
接下去N行,每行一个数字H(1 <= H <= 100),代表本层的高度。
输出
对于每组数据,输出一行,一个数字S,代表通往楼顶所需的最短时间。
样例输入
535184
样例输出
1
简单的动态规划,dp[i][0]表示不需要仙法到达这一层,到达这一层的方法和第i-1层有关,也就是可能是走着到达第i-1层,或者是使用仙法到达第i-1层,最后从i-1层走到i层,也就是dp[i][0]=min(dp[i-1][0],dp[i-1][1])+a[i]。dp[i][1]表示需要仙法到达这一层,到达这一层和第i-1层,还有i-2层有关,可能是从i-1层使用仙法过来的,也可能是从i-2层使用仙法过来的,因为仙法不能连续使用,所以到达i-1层和到达i-2层只能是不用仙法到达的,所以dp[i][1]=min(dp[i-1][0],dp[i-2][0])。
#include<stdio.h>#include<iostream>#include<string.h>using namespace std;int a[10010];int dp[10010][10];int main(){    int n;    while(scanf("%d",&n)!=-1)    {        for(int i=1; i<=n; i++)        {            scanf("%d",&a[i]);        }        memset(dp,0,sizeof(dp));        dp[1][0]=a[1],dp[1][1]=0;        for(int i=2;i<=n;i++)        {            for(int j=0;j<=1;j++)            {              if(j==0)              {                  dp[i][0]=min(dp[i-1][0],dp[i-1][1])+a[i];              }              else              {                  dp[i][1]=min(dp[i-1][0],dp[i-2][0]);              }            }        }        int m=min(dp[n][0],dp[n][1]);        printf("%d\n",m);    }}

0 0
原创粉丝点击