每周一题

【每周一题】2017.3.13 HDU1003 解题报告

2017-03-13  本文已影响0人  whucat

题目描述

解题分析

F(x+1)=F(x)+a[x+1]
F(x+1)=Max(F(x)+a[x+1],a[x+1])

算法分析

思考题

1. 这道题的时间复杂度和空间复杂度是多少?
2. 请写出这道题的动态规划三要素。

例程(C++)

(注:例程只是给出一种解题方法,不是标准程序,也不一定是最完美的解法)

//HDU 1003 by Xinjie Wang

#include <iostream>
using namespace std;

const int MAXLENGTH = 100001;
int numArr[MAXLENGTH], dp[MAXLENGTH], startPos[MAXLENGTH];

int main()
{
    int totalCase = 0;
    cin >> totalCase;
    for (int caseIter = 1; caseIter <= totalCase; caseIter ++)
    {
        if (caseIter > 1) cout << endl;
        cout << "Case " << caseIter << ":" << endl;
        
        int num = 0;
        cin >> num;
        //read inputnumbers - O(N)
        for (int i = 0; i < num; ++i)
        {
            cin >> numArr[i];
            dp[i] = 0;
            startPos[i] = 0;
        }

        //start dp function : dp[i] = MAX(dp[i - 1] + numArr[i], numArr[i])
        dp[0] = numArr[0];
        startPos[0] = 0;
        int maxNum = dp[0], retStart = 0, retEnd = 0;
        for (int i  = 1; i < num; ++i)
        {
            if (dp[i - 1] + numArr[i] >= numArr[i])
            {
                dp[i] = dp[i - 1] + numArr[i];
                startPos[i] = startPos[i - 1];
            }
            else
            {
                dp[i] = numArr[i];
                startPos[i] = i;
            }

            if (dp[i] > maxNum)
            {
                maxNum = dp[i];
                retStart = startPos[i];
                retEnd = i;
            }
        }
        cout << maxNum << " " << retStart + 1 << " " << retEnd + 1 << endl;
    }
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读