https://blog.csdn.net/qq_19446965/article/details/81331187
持续更新
1 动态规划背包问题 https://blog.csdn.net/qq_36303472/article/details/68935954
2 0-1背包:https://www.cnblogs.com/lfeng1205/p/5981198.html
3 动态规划题目https://blog.csdn.net/cc_again/article/details/25866971
4 动态规划-金额为Sum的所有纸(硬)币组合https://blog.csdn.net/f2006116/article/details/52565979
5 程序员面试、算法研究、编程艺术、红黑树、机器学习5大系列集锦https://blog.csdn.net/v_july_v/article/details/6543438
6 背包动态规划 https://blog.csdn.net/qq_40086556/article/details/80098064
7.一些类似于回文和背包的动态规划问题i:https://blog.csdn.net/qq_40086556/article/category/7785139
这些思路大致是一致的,一些变形题加了一些限制条件,那么在使用动态规划的时候,其转移方程某些条件就要受到限制
昨天的题:
一组没有重复数字的数组,求出能组合出mu'b目标target的种类有多少
设动态方程为DP[i][j]
含义是:在数组arry中前i个数neng能组成目标值target为j的组合有DP[i][j]种
如果说,第i个数
令temp=arry[i],如果temp>j,说明这第i个数比目标值要大,那么我们想组合成目标值为j的方法中就不可能存在有数字arry[i]
这种,那么也就只能从前i-1个数中找到目标值为j的方法数了,所以
if(arry[i]>j)
DP[i][j]= DP[i-1][j] //用前i-1个数字来组合成目标值为j的方法数
但是如果arry[i]<j,那么说明还有另外一些方法来组合成目标值j,其中这些方法的前提是必须存在数字arry[i]
那么相应的目标值就变为j-arry[i],所以就转换为在前i-1个数字中,找到目标值为j-arry[i]的方法数有多少种
DP[i][j]=DP[i-1][j-arry[i] ] //if(arry[i]<j)
所以把这两种情况综合起来就是能组成目标值为j的方法数
vector<vector<int>>DP(arry.size(),vector<int>(target,0));
for(int i=1 ;i<arry.size() ;i++)
{
for(int j=1;j<=target;j++)
{
DP[i][j]= DP[i-1][j] ;
if(arry[i]<j)
DP[i][j]+=DP[i-1][j-arry[i] ]
}
}
当然还得初始化:初始化还有点问题
就是用0个数字来组成目标值为j的方法数 0
for(int i = 1; i < n; i++) DP[0][j] =(arr[0]==j) ? 0 : obstacleGrid[0][i - 1]; 就是用前i个数右孩子)
dp[i][0]=0”