2025年UVAlive4490,状压DP的巧妙运用,注意边界

UVAlive4490,状压DP的巧妙运用,注意边界传送门 题解就不说了 网上到处是 我犯的错误有两个 第一个是强制第一个点选中 但实际上者是错的 然后大力对拍 拍了一万多组还没拍出来 然后眼调 发现最后求答案时 我是强制取出 k 本书 我觉得多取一定不必少取差 因为至少还可以放回去 但要是它的周围环境变了

大家好,我是讯享网,很高兴认识大家。

传送门
题解就不说了,网上到处是
我犯的错误有两个。第一个是强制第一个点选中,但实际上者是错的。然后大力对拍,拍了一万多组还没拍出来,然后眼调,发现最后求答案时,我是强制取出k本书,我觉得多取一定不必少取差,因为至少还可以放回去,但要是它的周围环境变了,直接放回去会变差,然后就错了。


讯享网

#include<cstdio> #include<cstring> const int N=155; int f[N][N][9][259],n,k,i,a[N],j,l,o,ans,T,inf,s,p; inline int A(int x){ return x-25; } inline int B(int x){ return 1<<A(x); } inline void up(int&a,int b){ if(a>b)a=b; } int main(){ while(scanf("%d%d",&n,&k)!=EOF){ if(n==0 && k==0)break; for(i=1,s=0;i<=n;++i)scanf("%d",a+i),s|=B(a[i]); memset(f,0x7f,sizeof f); f[1][0][A(a[1])][B(a[1])]=1; inf=f; for(i=1;i<n;++i) for(j=0;j<i && j<=k;++j){ if(j<=k && j==i-1)f[i][j][A(a[i])][B(a[i])]=1; for(l=0;l<8;++l) for(o=0;o<1<<8;++o)if(f[i][j][l][o]<inf){ up(f[i+1][j][A(a[i+1])][o|B(a[i+1])],f[i][j][l][o]+(l==A(a[i+1])?0:1)); if(j<k)up(f[i+1][j+1][l][o],f[i][j][l][o]); //printf("f[%d][%d][%d][%d]=%d\n",i,j,l,o,f[i][j][l][o]); } } ans=n; for(p=0;p<=k;++p) for(i=0;i<8;++i) for(j=0;j<1<<8;++j) if((s&j)==j){ for(l=o=0;l<8;++l) if((s^j)>>l&1)++o; up(ans,f[n][p][i][j]+o); } printf("Case %d: %d\n\n",++T,ans); } return 0; }

讯享网
小讯
上一篇 2025-02-15 10:39
下一篇 2025-02-22 07:54

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/53257.html