HDU 4455 Substrings 動態規劃

2021-09-06 10:04:11 字數 1148 閱讀 9790

題意:給定乙個整數串,有q組詢問,問這個串中長度為w的子串中不同的數字之和為多少,這題的動態規劃感覺很有技巧性。

解法:設f[i]表示w為 i 時不同的數字之和,那麼考慮f[i+1]和f[i]的關係可以得知:f[i+1]就是從f[i]中去除最後乙個子串後在每個串後加上乙個數字的情況,因此可以得到這樣的乙個遞推式:f[i] = f[i-1] - tail[n-i+2] + left   其中tail[n-i+2]表示長度為i-1的最後乙個子串中不同的數字共有多少個,left表示所有數字中與前乙個相同數字的長度大於 i 的數字還剩多少個。因此還要另外預處理出字尾不相同數字個數,和最近相同數字的長度,注意如果乙個數字只出現一次的話,那麼考慮到統計域的問題,應該將其視為長度為x,x為該元素的下標。本來這題是打算減掉那些長度小於 i 的值,但是由於無法考慮到乙個元素的統計域問題,一直調不出來。

**如下:

#include #include 

#include

#include

#include

using

namespace

std;

const

int maxn = 1000005

;typedef

long

long

ll;int

n, seq[maxn];

intcnt[maxn];

ll f[maxn];

intl[maxn];

inttail[maxn];

char

vis[maxn];

//l[i]記錄數字i出現的當前最靠右的位置

//cnt[i]記錄相同數字相鄰距離為i的數字的個數

//tail[i]記錄從後往前,即i到n的不同的數的數量

void

init()

else

}for (int i = n; i >= 1; --i)

}int left =n;

for (int i = 1; i <= n; ++i)

}int

main()

init();

scanf("%d

", &q);

while (q--)

}return

0;

}

HDU 4455 Substrings 動態規劃

題意 給定乙個整數串,有q組詢問,問這個串中長度為w的子串中不同的數字之和為多少,這題的動態規劃感覺很有技巧性。解法 設f i 表示w為 i 時不同的數字之和,那麼考慮f i 1 和f i 的關係可以得知 f i 1 就是從f i 中去除最後乙個子串後在每個串後加上乙個數字的情況,因此可以得到這樣的...

hdu 1238 Substrings 解題報告

題意很簡單,即找出最長的公共子串。n個序列為p 0 p n 1 最長公共子串 順著看,存放在p 0 的長度為maxlen,逆著看 存放在reverse陣列裡 的長度為maxlen1。由於公共子串行是每個序列的子串,因此不妨列舉第乙個序列 其實列舉最短的那個子串是最好的 的每乙個可能的子串s,以s為模...

!HDU 1176 DP (矩陣動規)

題意 有乙個數軸,從0到10,小明開始在5這個位置。現在天上開始掉餡餅,小明每次只能移動單位一的長度,求小明最多能接到多少餡餅。分析 剛開始接觸動態規劃,還沒有真正理解動規的思維,所以剛開始的dp做法不知道對不對但是tle了。正確的方法是建立乙個以時間為行位置為列的矩陣,最初map i j 代表的是...