Little Pony and Harmony Chest
经典状态压缩dp
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#define min(x,y) (x>y?y:x)
using namespace std;
int factor[],all,n,a[],b[][<<],pre[][<<],s1,s0,f[][<<],ansk;
bool pd[];
void print(int i,int k)
{
if(i==) return;
print(i-,pre[i][k]);
if(i==n) printf("%d",b[i][k]); else printf("%d ",b[i][k]);
return;
}
int main()
{
pd[]=;
for(int i=; i<=; i++)
if(!pd[i]){
factor[++all]=i;
for(int j=; i*j<=; j++)
pd[i*j]=;
}
scanf("%d",&n);
for(int i=; i<=n; i++)
scanf("%d",&a[i]);
memset(f,,sizeof(f));
for(int i=; i<=(<<)-; i++)
f[][i]=; int ans=;
for(int i=; i<=n; i++)
for(int j=; j<=; j++)
{
s1=(<<)-;
for(int k=; k<; k++)
if(j%factor[k]==) s1=s1^(<<(k-));
s0=s1^((<<)-);
for(int k=; k<=(<<)-; k++)
{
int p0=k&s1,p1=(k&s1)+s0;
if(f[i][p1]>f[i-][p0]+abs(a[i]-j))
{
f[i][p1]=f[i-][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 ;
}