题解看这个https://blog.csdn.net/u013534123/article/details/78926568
状压的debug真的很烦
#include<bits/stdc++.h> using namespace std; int mask[5][5],n,a[5],dp[1010][1<<16],b[5][2005]; char mp[5][2005]; /* 15 11 7 3 14 10 6 2 13 9 5 1 12 8 4 0 */ void premask(){ mask[0][0]=0b1111111111111111; mask[0][1]=0b0111111111111111; mask[1][0]=0b1111111111111111; mask[1][1]=0b1011111111111111; mask[1][2]=0b0011001111111111; mask[2][0]=0b1111111111111111; mask[2][1]=0b1101111111111111; mask[2][2]=0b1001100111111111; mask[2][3]=0b0001000100011111; mask[3][0]=0b1111111111111111; mask[3][1]=0b1110111111111111; mask[3][2]=0b1100110011111111; mask[3][3]=0b1000100010001111; mask[3][4]=0b0000000000000000; } int main(){ cin>>n; for(int i=1;i<=4;i++)cin>>a[i]; for(int i=0;i<4;i++)scanf("%s",mp[i]); for(int i=0;i<4;i++) for(int j=0;j<n;j++) b[i][j]=mp[i][j]=='*'?1:0; memset(dp,0x3f,sizeof dp); int init=0; for(int j=0;j<4;j++) for(int i=0;i<4;i++) init<<=1,init|=b[i][j]; dp[0][init]=0; premask(); for(int i=0;i<n;i++){ for(int s=0;s<(1<<16);s++){ if(dp[i][s]==0x3f3f3f3f)continue; for(int l1=0;l1<=1;l1++) for(int l2=0;l2<=2;l2++) for(int l3=0;l3<=3;l3++) for(int l4=0;l4<=4;l4++){ int now=s; //cout<<i<<" "<<now<<' '; now&=mask[0][l1]; //cout<<i<<" "<<now<<' '; now&=mask[1][l2]; //cout<<i<<" "<<now<<' '; now&=mask[2][l3]; //cout<<i<<" "<<now<<' '; now&=mask[3][l4]; //cout<<i<<" "<<now<<' '; //cout<<" "; if((now>>15)&1)continue; if((now>>14)&1)continue; if((now>>13)&1)continue; if((now>>12)&1)continue; int cost=a[l1]+a[l2]+a[l3]+a[l4]; int nxt=now; for(int j=0;j<4;j++){ nxt<<=1; nxt&=(1<<16)-1; nxt|=b[j][i+4]; } dp[i+1][nxt]=min(dp[i+1][nxt],dp[i][s]+cost); /*cout<<l1<<" "<<l2<<" "<<l3<<" "<<l4<<' '; cout<<i<<" "<<s<<" "<<nxt<<" "; cout<<dp[i][s]<<" "<<dp[i+1][nxt]<<" "; */ } } } /* for(int i=0;i<n;i++){ for(int s=0;s<(1<<16);s++) if(dp[i][s]!=0x3f3f3f3f)cout<<dp[i][s]<<" "; puts(""); }*/ cout<<dp[n][0]<<" "; }