• P1896 [SCOI2005]互不侵犯(状压dp)


    Miku

    真是自闭呢

    这个题还是还理解的

    dfs预处理出每一行的情况,然后dp

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int ok[2001];
    int n,kk;
    long long dp[10][2001][2001];
    int cou[2001];
    int si[2001];
    int cnt;
    void dfs(int p,int co,int ns){
    //	cout<<p<<endl;
    	if(p>n){
    		cnt++;
    		ok[cnt]=ns;
    		cou[cnt]=co;
    		return ;
    	}
    	dfs(p+1,co,ns);
    	dfs(p+2,co+1,ns+(1<<p));
    	return ;
    }
    long long ans;
    int main(){
    	scanf("%d%d",&n,&kk);
    	dfs(1,0,0);
    	for(int i=1;i<=cnt;++i)
    	{
    		dp[1][i][cou[i]]=1;
    	}
    	for(int i=2;i<=n;++i){
    		for(int j=1;j<=cnt;++j){
    			for(int k=1;k<=cnt;++k){
    				if((ok[j]&ok[k])==0){
    					if(((ok[j]<<1)&ok[k])==0){
    						if(((ok[j]>>1)&ok[k])==0){
    							for(int z=kk;z>=cou[j];z--){
    								dp[i][j][z]+=dp[i-1][k][z-cou[j]];
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    	for(int i=1;i<=cnt;++i){
    		ans+=dp[n][i][kk];
    	}
    	cout<<ans;
    	return 0;
    
  • 相关阅读:
    Add Binary
    Java笔记之String
    Java笔记之数组
    Merge Two Sorted Lists
    Remove Nth Node From End of List
    Longest Common Prefix
    Roman to Integer
    Palindrome Number
    Reverse Integer
    _cdel stdcall
  • 原文地址:https://www.cnblogs.com/For-Miku/p/13455664.html
Copyright © 2020-2023  润新知