題意:在一個數組中,找到最多的不相交的子序列,每個子序列的和等於target。
題解:動態規劃 dp[i]表示從0到i的子數組的答案。維護前綴數組sums[],我們維護一個記錄前綴和的map,map[x]表示前綴和是x距離當前i最近的下標。
那麼狀態轉移方程就是dp[i] = max(dp[i-1], dp[map[sums[i]-target]]+1)
class Solution {
public:
int dp[100005];
int sum[100005];
map<int, int> m;
int maxNonOverlapping(vector<int>& nums, int target) {
sum[0] = nums[0];
dp[0] = 0;
if (nums[0] == target)
dp[0] = 1;
m[0] = -1;
m[nums[0]] = 0;
for (int i = 1; i < nums.size(); i++)
{
sum[i] = nums[i] + sum[i - 1];
int left = sum[i] - target;
if (m.find(left) == m.end())
{
dp[i] = dp[i - 1];
}
else
{
int pos = m[left];
dp[i] = max(dp[i - 1], (pos == -1 ? 0 : dp[pos]) + 1);
}
m[sum[i]] = i;
}
return dp[nums.size() - 1];
}
};