首页 > 代码库 > Little Pony and Harmony Chest CF4538 (状态压缩dp)
Little Pony and Harmony Chest CF4538 (状态压缩dp)
经典状态压缩dp
#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#define min(x,y) (x>y?y:x)using namespace std;int factor[30],all,n,a[105],b[105][1<<17],pre[105][1<<17],s1,s0,f[105][1<<17],ansk;bool pd[80];void print(int i,int k){ if(i==0) return; print(i-1,pre[i][k]); if(i==n) printf("%d",b[i][k]); else printf("%d ",b[i][k]); return;}int main(){ pd[1]=1; for(int i=2; i<=60; i++) if(!pd[i]){ factor[++all]=i; for(int j=2; i*j<=60; j++) pd[i*j]=1; } scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&a[i]); memset(f,127,sizeof(f)); for(int i=0; i<=(1<<16)-1; i++) f[0][i]=0; int ans=10000000; for(int i=1; i<=n; i++) for(int j=1; j<=59; j++) { s1=(1<<16)-1; for(int k=1; k<17; k++) if(j%factor[k]==0) s1=s1^(1<<(k-1)); s0=s1^((1<<16)-1); for(int k=0; k<=(1<<16)-1; k++) { int p0=k&s1,p1=(k&s1)+s0; if(f[i][p1]>f[i-1][p0]+abs(a[i]-j)) { f[i][p1]=f[i-1][p0]+abs(a[i]-j); b[i][p1]=j; pre[i][p1]=p0; } if(i==n&&ans>f[n][p1]) { ans=f[n][p1]; ansk=p1; } } } print(n,ansk); return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。