根据目前我所做的几个dp题的小总结
背包问题经过简化过就先不参与比较 背包总结
一下仅个人理解:
根据所求的不同dp数组代表不同含义
dp主要是填表的过程------>用前面求出来的更新后面的并取最优
----->填表的顺序 由后面需要用到前面求出的值有关
(假设前面已经是最优值,当前要对dp[i-1]或dp[i+1]进行怎样的操作)
冰水挑战 ---->最大活动数量 dp[i][j]表示前i个活动参加了j个的体力活动数量 dp[n][j]
建商店----->最少花费 dp[i][j]表示前i在当前建dp[i][1]或不建dp[i][0]的花费
矩阵连乘----->最少乘次 dp[i][j]表示从i到j乘次
数字三角----->最少经过数字和 dp[i][j]表示从坐标(i,j)到终点经过的数字和
填表(把表填满)
------------把表填好后选用不同的点判断取最优
i教室建或不建 取最优 花费 dp[i][0] dp[i][1]
i活动选或不选 取最优 活动数j dp[i][j]
(i,j)之间在哪分割 取最优 乘积 dp[i][j]
------------根据下一次可能用到的判断循环顺序
//建商店
for(i=1;i<=n;i++)//当前循环
{
dp[i][1]=min(dp[i-1][0],dp[i-1][1])+a[i].c;
for(j=1;j<i;j++)//比较之前的更新选最优
{
//更新的条件
dp[i][0]=min(dp[i][0],dp[j][1]+disum[j][i]);
}
}
//最长上升子序列
for(i=1;i<=n;i++)//当前循环
{
dp[i]=1;
for(j=1;j<i;j++)//比较之前的更新选最优
{
//更新条件
if(a[j]<a[i])
{
dp[i]=max(dp[i],dp[j]+1);
}
}
}