状态:问题当前所处的局面
转移:状态之间的关系
阶段:计算状态的顺序
一维DP优化:
for(int i=1;i<=n;i++){
int pos=lower_bound(g+1,g+len+1,a[i]);
g[pos]=a[i];
len=max(len,pos);
}
完全背包 ——> 多重背包:
能选此物品这个物品最多能选的次数
分组背包(组内互斥)
for(int k=1;i<=组数;i++)
{
for(int i=背包容量;i>=0;i++)
{
for(int j=1;j<=小组物品数;j++)
{
if(i>=w[j]) dp[i]=max(dp[i-1],dp[i-w[j]]+v[j])
}
}
}
区间DP:
for(int len=2;len<=n;len++) (区间长度)
{
for(int i=1;i<=n-len+1;i++) (端点)
{
int j=i+len-1;
for(int k=i;k<j;k++) (分割点)
{
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);
}
}
}