拿數問題 II Week10作業C題

2021-10-07 23:12:40 字數 1396 閱讀 5360

yjq 上完第10周的程式設計思維與實踐後,想到乙個絕妙的主意,他對拿數問題做了一點小修改,使得這道題變成了 拿數問題 ii。

給乙個序列,裡邊有 n 個數,每一步能拿走乙個數,比如拿第 i 個數, ai = x,得到相應的分數 x,但拿掉這個 ai 後,x+1 和 x-1 (如果有 aj = x+1 或 aj = x-1 存在) 就會變得不可拿(但是有 aj = x 的話可以繼續拿這個 x)。求最大分數。

輸入:第一行包含乙個整數 n (1 ≤ n ≤ 105),表示數字裡的元素的個數

第二行包含n個整數a1, a2, …, an (1 ≤ ai ≤ 105)

輸出:輸出乙個整數:n你能得到最大分值。

樣例:input:

2

1 2

output:

2
input:

3

1 2 3

output:

4
input:

9

1 2 1 3 2 2 2 2 3

output:

10
對於第三個樣例:先選任何乙個值為2的元素,最後陣列內剩下4個2。然後4次選擇2,最終得到10分。

本題對元素值的大小有限制:不能選擇值相鄰的。

因此對數值大小進行列舉,記錄最小元素的值為minn,最大元素的值為maxx.

f陣列針對元素的值:fi為從minn…i能夠獲取的最大分數。

設sum陣列,sumi表示值為i的元素出現的個數。

因此,f[minn]=minnsum[minn],

狀態轉移方程:f[i]=max(f[i-1],f[i-2]+isum[i]);

#include

using

namespace std;

const

int ma***x=

100010

;long

long n,minn=ma***x,maxx;

long

long a[ma***x]

,sum[ma***x]

,f[ma***x]

;int

main()

f[minn]

=minn*sum[minn]

;for

(long

long i=minn;i<=maxx;i++

)//列舉

f[i]

=max

(f[i-1]

,f[i-2]

+sum[i]

*i);

cout<;return0;

}

week10 作業C 拿數問題II

給 n 個數,每一步能拿走乙個數,比如拿第 i 個數,ai x,得到相應的分數 x,但拿掉這個 ai 後,x 1 和 x 1 如果有 aj x 1 或 aj x 1 存在 就會變得不可拿 但是有 aj x 的話可以繼續拿這個 x 求最大分數。本題和課上講的有些許不一樣,但是核心是一樣,需要你自己思考...

Week10 作業 C 拿數問題 II

一 題目描述 題面 給 n 個數,每一步能拿走乙個數,比如拿第 i 個數,ai x,得到相應的分數 x,但拿掉這個 ai 後,x 1 和 x 1 如果有 aj x 1 或 aj x 1 存在 就會變得不可拿 但是有 aj x 的話可以繼續拿這個 x 求最大分數。本題和課上講的有些許不一樣,但是核心是...

Week10 作業C 拿數問題 II

yjq 上完第10周的程式設計思維與實踐後,想到乙個絕妙的主意,他對拿數問題做了一點小修改,使得這道題變成了 拿數問題 ii。給乙個序列,裡邊有 n 個數,每一步能拿走乙個數,比如拿第 i 個數,ai x,得到相應的分數 x,但拿掉這個 ai 後,x 1 和 x 1 如果有 aj x 1 或 aj ...