刚开始看的区间dp,区间dp是在一个区间内进行动态规划的一种策略,或者是化环为链,再进行dp,常与三重循环进行,其中最外层经常是区间长度,接着是区间起点,然后是断点。常用代码框架是:
for (int len=1; len<n; len++)//按长度从小到大枚举//控制长度;
{
for (int i=1; i<=n&&i+len<=n; i++)//i表示开始位置
{
int j=len+i; //j表示长度为len的一段区间的结束位置
for (int k=i; k<j; k++) //用k来表示分割区间
{
sum[i][j]=sum[i][k]+sum[k+1][j];
if (dp[i][j]<dp[i][k]+dp[k+1][j]+sum[i][j])
dp[i][j]=dp[i][k]+dp[k+1][j]+sum[i][j];
//cout<<i<<" "<<j<<" "<<sum[i][j]<<" "<<k<<" "<<dp[i][j]<<endl;
}
}
}
需要确定好状态转移,初始化方程也十分重要。先确定好初始状态,列好方程,然后根据状态转移进行方程的变化。难点是找准状态转移是根据什么变化。
接着是数位dp,数位DP就是基于考虑数字的每一位来转移的dp,数位dp经常要分解各个位上的数、进行下一位的深搜、记忆化搜索,其中深搜的步骤几乎一样,不同的是状态转移就是变化很大,需要仔细分析,有时候要考虑前导0问题,有时候可以不用考虑,但是还是要弄懂它的思想才行。
然后看了树形dp,树形dp经常与邻接链表联系,找到父节点,从底层往上遍历。也经常与深搜相关,利用深搜进行辅助。
没看完状压dp,还没真正搞懂它的思想,对二进制枚举思想没理解那么深,还要继续攻克。争取这几天看完。
开学后要坚持做题,加油。