這道題,比較有意思,他們說用c++的map會好些很多,而且節省空間,奈何我不會啊(有興趣的道友,而可自行實現)。
一道遞推的題目,因t為不會c++的map所以我只能用陣列來實現,但是有負數啊,陣列索引不能為負數啊,這可怎麼辦涼涼了。簡單暴力的方法,直接加上最大邊界值,陣列開兩倍大,相當於去掉了符號。這時候我們就可以開出我們的dp陣列了。既然是遞推那麼就得有 遞推公式 。也很簡單, 最長啥啥啥的那不就是步長為 1 一次次累加的關係嗎?而且還要最長,那肯定得要有max函式了。我們設dp[i]表示當前序列最後乙個數是i的最大子串行長度,每一次i++之後我們都與上一次認定的「最長值」進行比較,如果中間斷開,那麼由於上一次的「最長值」 的索引由步長決定,且步長為固定值,所以斷開後會自動重新計數。有這個規律我們可以很輕易的寫出狀態轉移方程:
dp[i]=max(dp[i],dp[i-difference]+1);
當然這僅僅是動態轉移方程,具體實現起來還是需要改動的。大家可以自己先試試如何實現,再來看**。
1/**view code2* @brief 最長定差子串行
3* @note 一定要加10000
4* @param arr: 給定序列
5* @param arrsize: 序列長度
6* @param difference: 定固差
7* @author 楊文蓁的小迷弟 8*/
9int longestsubsequence(int* arr, int arrsize, int
difference);
12for (int i = 0; i < arrsize; i++)
1316
17for (int i = 0; i < arrsize; i++)
1824
else
2528 ans = ans > dp[arr[i]] ?ans : dp[arr[i]];
29 printf("
%d\n
", ans);30}
3132
return
ans;
33 }
周賽不易,諸君共勉!
1218 最長定差子串行
給你乙個整數陣列 arr 和乙個整數 difference,請你找出 arr 中所有相鄰元素之間的差等於給定 difference 的等差子串行,並返回其中最長的等差子串行的長度。示例 1 輸入 arr 1,2,3,4 difference 1 輸出 4 解釋 最長的等差子串行是 1,2,3,4 示...
Leetcode 1218 最長定差子串行
給你乙個整數陣列 arr 和乙個整數 difference,請你找出 arr 中所有相鄰元素之間的差等於給定 difference 的等差子串行,並返回其中最長的等差子串行的長度。示例 1 輸入 arr 1,2,3,4 difference 1 輸出 4 解釋 最長的等差子串行是 1,2,3,4 示...
LeetCode 1218 最長定差子串行
給你乙個整數陣列 arr 和乙個整數 difference,請你找出 arr 中所有相鄰元素之間的差等於給定 difference 的等差子串行,並返回其中最長的等差子串行的長度。class solution def longestsubsequence self,arr list int diff...