由POJ1821得出的一些dp优化技巧
比如
for(int i=1;i<=m;i++){
for(int j=0;j<=n;j++){
dp[i][j]=dp[i-1][j];
}
for(int l=max(1,s[i]-l[i]+1);l<=s[i];l++){
for(int r=s[i];r<=min(n,l+l[i]-1);r++){
dp[i][r]=max(dp[i][r],dp[i-1][l-1]+p[i]*(r-l+1));
}
}
}
这个dp显然可以优化,但是这个不好优化,因为我的方程是dp[i][r]=......,然而i在第一层循环,而r在第三层循环,中间加了一个l。但是我们只要将二三两层循环调换位置就可以了。
又比如
for(int i=1;i<=m;i++){
for(int j=0;j<=n;j++){
dp[i][j]=dp[i-1][j];
}
for(int len=1;len<=l[i];len++){
for(int l=max(1,s[i]-len+1);(l<=s[i])&&(l+len-1<=n);l++){
int r=l+len-1;
dp[i][r]=max(dp[i][r],dp[i-1][l-1])+p[i]*len;
}
}
}
这个和上面一样,但是这个也不好优化,虽然也有上面的问题,但是这个还有一个问题。可以看到这里的r是通过len和l间接求出来的,这样显然是不好的,所以dp里面的东西一定要在循环上枚举。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?