动态规划之Help Jimmy

作者: cherryleechen | 来源:发表于2017-10-09 13:09 被阅读5次

问题描述

解题思路

程序实现

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

const int MAXN = 1001;
const int INFINITE = 10000000;

int leftMinTime[MAXN];
int rightMinTime[MAXN];

struct boards
{
    int left, right;
    int height;
};
boards board[MAXN];

int N, X, Y, MAX;

bool myCompare(boards b1, boards b2)
{
    return b1.height > b2.height;
}


int main()
{
    int t;
    cin >> t;
    for(int a = 0; a < t; a++)
        {
            cin >> N >> X >> Y >> MAX;
            board[0].left = X;
            board[0].right = X;
            board[0].height = Y;
            leftMinTime[0] = INFINITE;
            rightMinTime[0] = INFINITE;
            for(int n = 1; n <= N; n++)
                {
                    cin >> board[n].left >> board[n].right >> board[n].height;
                    leftMinTime[n] = INFINITE;
                    rightMinTime[n] = INFINITE;
                }
            sort(board + 1, board + 1 + N, myCompare);
            for(int i = N; i >= 0; i--)
                {
                    for(int j = i + 1; j <= N + 1; j++)
                        {
                            if(j == N + 1)
                                {//找不到i的左端的下面那块板子
                                    if(board[i].height > MAX)
                                        leftMinTime[i] = INFINITE;
                                    else
                                        leftMinTime[i] = board[i].height;
                                }
                            else if((j < N + 1) and (board[j].left <= board[i].left) and (board[j].right >= board[i].left))
                                {//找到i的左端的下面那块板子
                                    int hl = board[i].height - board[j].height;
                                    if(hl <= MAX)
                                        leftMinTime[i] = min(leftMinTime[i], hl + min(rightMinTime[j] + board[j].right - board[i].left, leftMinTime[j] + board[i].left - board[j].left));
                                    else
                                        leftMinTime[i] = INFINITE;
                                    break;
                                }
                        }
                    for(int j = i + 1; j <= N + 1; j++)
                        {
                            if(j == N + 1)
                                {//找不到i的右端的下面那块板子
                                    if(board[i].height > MAX)
                                        rightMinTime[i] = INFINITE;
                                    else
                                        rightMinTime[i] = board[i].height;
                                }
                            else if((j < N + 1) and (board[j].right >= board[i].right) and board[j].left <= board[i].right)
                                {//找到i的右端的下面那块板子
                                    int hr = board[i].height - board[j].height;
                                    if(hr <= MAX)
                                        rightMinTime[i] = min(rightMinTime[i],
                                                              min(rightMinTime[j] + board[j].right - board[i].right,
                                                                  leftMinTime[j] + board[i].right - board[j].left) + hr);
                                    else
                                        rightMinTime[i] = INFINITE;
                                    break;
                                }

                        }
//                    cout << leftMinTime[i] << rightMinTime[i] << endl;

                }
            int minTime = min(leftMinTime[0], rightMinTime[0]);
//            cout << minTime << endl;
//            cout << INFINITE << endl;
            if(minTime >= INFINITE)
                {
                    cout << "NO!" << endl;
                }
            else
                {
                    cout << minTime << endl;
                }

        }
}

运行结果

相关文章

  • 动态规划之Help Jimmy

    问题描述 解题思路 程序实现 运行结果

  • 三、动态规划(1)-Help Jimmy(POJ1661)

  • 4. 动态规划算法

    1. 动态规划算法总结2. 漫画:什么是动态规划?3.算法之动态规划4. 动态规划-算法

  • 2018-11-14

    今天学了动态规划一些知识,着重看了一下动态规划之背包算法(主要是0-1算法和部分算法),关于动态规划的问题重点是建...

  • 算法之【动态规划】详解(python)

    算法之动态规划详解 定义 动态规划其实是一种运筹学方法,是在多轮决策过程中寻找最优解的方法。 应用场景 动态规划问...

  • Algorithm进阶计划 -- 动态规划(上)

    动态规划动态规划的基本原理动态规划的运用 1. 动态规划的基本原理 动态规划(Dynamic Programmi...

  • [动态规划]Leetcode 1143.最长公共子序列

    如果读者对于动态规划思路解法还不是很了解,可以查阅我之前的一篇博文《算法之【动态规划】详解》,很详细的介绍了动态规...

  • 最优化模型

    数据挖掘之优化模型 1.1数学规划模型 线性规划、整数线性规划、非线性规划、多目标规划、动态规划。 1.2微分方程...

  • 动态规划 Dynamic Programming

    从运筹学和算法的角度综合介绍动态规划 算法分类总结动态规划与静态规划的关系浅析静态规划和动态规划动态规划解非线性规...

  • 动态规划之数组

    动态规划是从初始值算到目标值。递归是从目标值推到初始值。1.Given an integer array with...

网友评论

    本文标题:动态规划之Help Jimmy

    本文链接:https://www.haomeiwen.com/subject/niauyxtx.html