zoukankan      html  css  js  c++  java
  • LeetCode 1546. Maximum Number of Non-Overlapping Subarrays With Sum Equals Target(动态规划)

    题目

    题意:在一个数组中,找到最多的不相交的子序列,每个子序列的和等于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];
    }
    };
    
  • 相关阅读:
    jdk的entity表格注解·
    事务管理简单
    spring注解和jdk注解简单概述
    ssh框架简化
    spring简单的框架
    hibernate简单的框架
    struts2简单的框架
    ssh框架总结
    博客搬迁到新址
    动态编译和静态编译,共享库
  • 原文地址:https://www.cnblogs.com/dacc123/p/13497345.html
Copyright © 2011-2022 走看看