zoukankan      html  css  js  c++  java
  • hdu 5691 Sitting in line 状压动归

    在本题中,n<=16n<=16, 不难想到可以将所选数字的编号进行状态压缩。
    定义状态 dp[S][j]dp[S][j],其中 SS 代表当前所选出的所有数字编号,jj 代表当前位置考虑的数字编号。
    如果状态合法,可以转移状态 dp[S][j]=max(dp[S][j],dp[Sdp[S][j]=max(dp[S][j], dp[S^j][k]+val[j]val[k])j][k] +val[j]*val[k])
    不合法就直接跳过
    本题比较简单,只要细节上不出错应该是一道送分题。

    #include<cstdio>//hdu 5691
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=16;
    const long long INF=-122222222222;
    long long dp[1<<N][N+2];
    int pos[N+2],val[N+2],idx[N+2];
    int n;
    void init()
    {
    	memset(idx,0,sizeof(idx));
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i)
    	{
    		scanf("%d%d",&val[i],&pos[i]);
    		pos[i]=(pos[i]==-1)?-1:pos[i]+1;
    		if(pos[i]>0)idx[pos[i]]=i;
    	}
    }
    int check(int i,int j)
    {
    	int cnt=0;
    	if((i&(1<<(j-1)))==0)return 0;                     //当前考虑的数在 i 中不存在。
    	for(int k=0;(1<<k)<=i;++k)if(i&(1<<k))++cnt;
    	if(pos[j]!=-1&&cnt!=pos[j])return 0;
        if(idx[cnt]&&idx[cnt]!=j)return 0;
        return 1;
    }
    int times(int s){
    	int cnt=0;
    	for(int k=0;(1<<k)<=s;++k)if(s&(1<<k))++cnt;
    	return cnt;
    }
    int main(){
    	int T;scanf("%d",&T);
    	for(int cas=1;cas<=T;++cas)
    	{
    		init();
    		for(int S=1;S<(1<<n);++S)
    			for(int j=1;j<=n;++j)                       
    			{
    				dp[S][j]=INF;
    				int mx=(S^(1<<(j-1)));
    
    				if(check(S,j)==0)continue;     
    				if(mx==0){dp[S][j]=val[j];continue;}
    				int cnt=times(mx);
    				for(int k=1;k<=n;++k)
    				{
    					if(k==j)continue;
    					if(cnt==1)
    					{
    						long long a=0;
    						if(check(mx,k))dp[S][j]=max(dp[S][j],a+val[k]*val[j]);
    					}
    					else dp[S][j]=max(dp[S][j],dp[mx][k]+val[k]*val[j]);
    				}
    			}
    		long long ans=INF;
    		for(int i=1;i<=n;++i)
    			ans=max(ans,dp[(1<<n)-1][i]);	
    		printf("Case #%d:
    ",cas);
    		printf("%lld
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    操作系统学习五部曲
    由实模式进入保护模式
    extends && implements
    <mvc:annotation-driven>
    集合类关系
    Servlet8
    SprigMVC基础测试
    (转载)synchronized代码块
    jetty与tomcat
    输入输出流总结
  • 原文地址:https://www.cnblogs.com/guangheli/p/9845115.html
Copyright © 2011-2022 走看看