码迷,mamicode.com
首页 > 其他好文 > 详细

【题解】桐桐的爬山计划

时间:2019-05-03 11:56:05      阅读:491      评论:0      收藏:0      [点我收藏+]

标签:参考   event   出发点   cli   style   i++   ble   ssi   描述   

题目描述

        桐桐一直有个梦想,很希望像“蜘蛛人”罗伯特一样飞檐走壁。为了达成这个梦想,桐桐每天都辛勤练习攀爬。练习的出发点与终点都是在地上面。给出一个数列,代表她每次移动的距离。这个移动可以向上,也可以向下。但是不可能到达地下面去的。而她做练习使用的建筑物总是比她到达过的最高位置高2米。现在我们希望这个建筑物的高度越小越好。

        如:20 20 20 20

        如果是上,上,下,下的话,这个建筑物就要42米高,如果是上,下,上,下,就只要22米高。

       当然有些数列是无解的,例如:3 4 2 1 6 4 5。

 

输入格式

        第一行输入n(n≤100),代表有n个爬行距离;

        第二行输入n个爬行距离(均为整数),这些爬行距离的总和不超过10000。

 

输出格式

        如果有解,则输出最小的高度;

        否则输出“IMPOSSIBLE”。

 

输入样例

4

20 20 20 20

 

输出样例

22

 

题解

        我们用记录第$i$次爬行达到的高度的到达过的最高高度,则dp即可。

技术图片
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#define MAXN 101

using namespace std;

int n;
int a[MAXN][10001]; //达到过的最高高度
// 一维: 第几次爬行
// 二维: 目前达到的高度

int main()
{
    scanf("%d", &n);
    int maxnow = 0;
    for(register int i = 1, tmp; i <= n; i++)
    {
        scanf("%d", &tmp);
        maxnow += tmp;
        if(i == 1) a[1][tmp] = tmp;
        else for(register int j = 0; j <= maxnow; j++)
        {
            if((j - tmp < 0 || !a[i - 1][max(0, j - tmp)]) && (j + tmp > maxnow || !a[i - 1][min(maxnow, j + tmp)]))         
                continue;
            if(j - tmp < 0 || !a[i - 1][max(0, j - tmp)])
                a[i][j] = max(j, a[i - 1][j + tmp]);
            else if(j + tmp > maxnow || !a[i - 1][j + tmp])
                a[i][j] = max(j, a[i - 1][j - tmp]);
            else
                a[i][j] = max(j, min(a[i - 1][j - tmp],a[i - 1][j + tmp]));
        }
    }
    a[n][0] ? printf("%d", a[n][0] + 2) : puts("IMPOSSIBLE");
    return 0;
}
参考程序

 

【题解】桐桐的爬山计划

标签:参考   event   出发点   cli   style   i++   ble   ssi   描述   

原文地址:https://www.cnblogs.com/kcn999/p/10804553.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!