AcWing 算法基础课 状态压缩dp
291. 蒙德里安的梦想
此题使用状态压缩dp进行计算,状态表示使用一个数j,其中j的二进制位为1的位置表示1*2的第一个小方格并向后延伸。
由于1*2的第二个小方格和2*1的任意一个小方格与后面是没有联系的,对于后面的处理是等价的,
所以状态只用表示和后面产生联系的1*2的第一个小方格。
转移方法为判断是否合法。

#include<bits/stdc++.h> using namespace std; long long dp[15][1<<12]; vector<vector<int>> check(1<<12); bool Check(int k,int j,int m) { if(j&k) return false; int cur=0; int jk=j|k; for(int i=0;i<m;i++) { if((jk>>i)&1) { if(cur%2!=0) return false; } else { cur++; } } if(cur%2==0) return true; else return false; } int main() { int m,n; while(1) { cin>>m>>n; if(m==0||n==0) break; //memset(dp,0,sizeof(dp)); check=vector<vector<int>>(1<<12); for(int j=0;j<=(1<<m)-1;j++) { for(int k=0;k<=(1<<m)-1;k++) { if(Check(j,k,m)) check[j].push_back(k); } } for(int j=0;j<=(1<<m)-1;j++) { dp[0][j]=0; } for(auto k:check[0]) dp[0][k]=1; for(int i=1;i<n;i++) { for(int j=0;j<=(1<<m)-1;j++) { dp[i][j]=0; for(auto k:check[j]) dp[i][j]+=dp[i-1][k]; } } cout<<dp[n-1][0]<<endl; } return 0; }
AcWing 91. 最短Hamilton路径
对H路进行dp,可以枚举当前已经经过的点以及当前结尾的点。当前经过的点可以进行二进制状态压缩。
转移通过上一个点进行转移

#include<bits/stdc++.h> using namespace std; typedef long long LL; LL a[25][25]; LL dp[25][1<<20]; int main() { int n; cin>>n; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) cin>>a[i][j]; } memset(dp,0x3f,sizeof(dp)); dp[0][1]=0; for(int j=1;j<(1<<n);j++) { for(int k=0;k<n;k++) { if(j&1==1&&((j>>k)&1)==1) { for(int iii=0;iii<n;iii++) { if(j-(1<<k)>>iii&1) { dp[k][j]=min(dp[k][j],dp[iii][j-(1<<k)]+a[iii][k]); } } } } } //cout<<dp[1][3]<<endl; cout<<dp[n-1][(1<<n)-1]<<endl; }
#include<bits/stdc++.h>using namespace std;
typedef long long LL;
LL a[25][25];LL dp[25][1<<20];int main(){ int n; cin>>n; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) cin>>a[i][j]; } memset(dp,0x3f,sizeof(dp)); dp[0][1]=0;
for(int j=1;j<(1<<n);j++) { for(int k=0;k<n;k++) { if(j&1==1&&((j>>k)&1)==1) { for(int iii=0;iii<n;iii++) { if(j-(1<<k)>>iii&1) { dp[k][j]=min(dp[k][j],dp[iii][j-(1<<k)]+a[iii][k]); } } } } } //cout<<dp[1][3]<<endl; cout<<dp[n-1][(1<<n)-1]<<endl;}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人