題意:給定乙個整數串,有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 代表的是...