【leetcode】T3144(附DP&记忆化通用思路)*


DP&记忆化通用思路总结

  • //DP思想:                                寻找与原问题 同类的 更小的子问题
  • //确定更小的同类问题:            可以用递归
  • //发掘大小问题的通用逻辑:     递归函数写什么
    • //递归函数基本构成:
      •         //确定这个递归函数返回什么结果
      •         //递归结束条件
      •         //递归函数主体
  • //什么时候用记忆化:
    • //存在大量重复计算时 <=> 递归函数参数相同,那么结果必然一样    

本题实战代码

初步构建递归 (提交后超时)

class Solution {
public:	
		//DP思想: 寻找与原问题 同类的 更小的子问题
		//更小的同类问题: 可以用递归
		//通用逻辑:       递归函数写什么
			//递归函数基本构成:
				//递归函数返回值
				//递归结束条件
				//递归函数主体
    int minimumSubstringsInPartition(string s) {
    	int len = s.length();
    	//确定返回值: s的长度为 i+1 的前缀 最少可以被分隔为多少个平衡子串
    	auto dfs = [&](auto&& dfs, int i) -> int {
			if( i<0 ) return 0;
			int res = INT_MAX, k=0, max_num = 0;
			int word[26]{};
			for(int j=i; j>0; j--)
			{
				//"从右往左"依次遍历
				k += word[s[j] - 'a']++ == 0;
				max_num = max(max_num, word[s[j] - 'a']);
				if(i-j+1 == k*max_num) 
				{
					res = min(res, dfs(dfs, j)+1);
				}
			}
			return res;
		}		
		return dfs(s.length()-1);		
    }
};

加入记忆化:

class Solution {
public:
    int minimumSubstringsInPartition(string s) {
    	int len = s.length();
    	vector<int>memo(len);
    	//确定返回值: s的长度为 i+1 的前缀 最少可以被分隔为多少个平衡子串
    	auto dfs = [&](auto&& dfs, int i) -> int {
			if( i<0 ) return 0;
			if(memo[i]) return memo[i];
			int res = INT_MAX, k=0, max_num = 0;
			int word[26]{};
			for(int j=i; j>0; j--)
			{
				//"从右往左"依次遍历
				k += word[s[j] - 'a']++ == 0;
				max_num = max(max_num, word[s[j] - 'a']);
				if(i-j+1 == k*max_num) 
				{
					int h = dfs(dfs, j-1);
					res = min(res, dfs(dfs, j-1)+1);
					
				}
			}
			memo[i] = res;
			return res;
		};			
		return dfs(dfs, len-1);		
    }
};

~希望对你有启发!~

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值