題目描述
現在給你n個正整數ai,每個數給出一「好數程度」 gi(數值相同但位置不同的數之間可能有不同的好數程度)。對於在 i 位置的數,如果有一在j位置的數滿足 j < i 且 ai=aj,則你可以將位於[i,j]閉區間內的序列評為「好序列」,然後獲得∑gk(j≤k≤i)(此閉區間內「好數程度」之和)分數。
注意: 在所有情況下,每個數都只能被乙個」好序列」包含(只能與其他相應數被評為」好序列」一次);在符合要求的情況下,」好序列」的評定次數不受限制,且通過不同」好序列」獲得的分數可以累加。
輸入描述:
第一行有乙個正整數n。
接下來的一行有n個正整數ai,表示意義如上。
(保證ai在32位整型範圍內)
接下來的一行有n個正整數gi,表示ai的」好數程度」。
(保證gi在64位整型範圍內)
輸出描述:
乙個整數,你可以獲得的最大分數(通過不同」好序列」獲得的分數可以累加),保證答案在64位整型範圍內。
示例1
輸入 複製
7 1 2 1 2 3 2 3
1 4 3 4 3 4 5
輸出 複製
23 備註:
資料範圍 2≤n≤300000
本來是用next做的,可是那樣很麻煩,應該用pre做,這樣可以少考慮一些情況而且**會比較簡單, dp
[i][
j],i
表示的是
位置,j
表示的是
是否取這
位數d p[
i][j
],i表
示的是位
置,j表
示的是是
否取這位
數所有的數只能取一遍,所以在dp[vis[i]][1]的時候不用減一
#include
using
namespace
std;
#define ll long long
const
int maxn=3e5+5;
ll a[maxn],b[maxn];
ll dp[maxn][2];
mapint>vis;
int main()
vis[a[i]]=i;
}printf("%lld\n",max(dp[n][1],dp[n][0]));
return
0;}
Wannafly挑戰賽21 C 大水題
題目描述 現在給你n個正整數ai,每個數給出一 好數程度 gi 數值相同但位置不同的數之間可能有不同的好數程度 對於在 i 位置的數,如果有一在j位置的數滿足 j i 且 ai aj,則你可以將位於 i,j 閉區間內的序列評為 好序列 然後獲得 gk j k i 此閉區間內 好數程度 之和 分數。注...
Wannafly挑戰賽21 大水題 DP
時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 題目描述 現在給你n個正整數ai,每個數給出一 好數程度 gi 數值相同但位置不同的數之間可能有不同的好數程度 對於在 i 位置的數,如果有一在j位置的數滿足 j ...
Wannafly挑戰賽A 概率DP
給你乙個長 n 的序列,m 次查詢 每次查詢給乙個 x,然後 從序列的最左端 1 開始,每次隨機的選擇乙個右端點 r,如果兩個端點間的區間和不超過 x 就進行一次分割,然後把左端點變成 r 1,否則一直隨機下去。問這樣分割出來的期望段數 第一行兩個數 n,m 之後一行 n 個數表示這個序列 之後m行...