hdu 4539 郑厂长系列故事——排兵布阵 (状态压缩dp)

题目链接:点击打开链接

#include
#include

int dp[110][200][200];// dp[i][j][k] 存第i行 状态为state[j] 上一行状态为state[k] 所能安排士兵的最大值
int num[200];// 存合法状态对应的士兵数
int state[200]; // 存行内不冲突的合法状态
int map[110];// 用二进制按行存图
int limit;// dp上界
int size;// 合法状态数
int n,m;

int get(int x)// 计算状态x  包含1的个数
{
    int ans=0;
    while(x>0)
    {
        ans+=x%2;
        x=x/2;
    }
    return ans;
}

void in()// 把行内不冲突的合法状态存到state中
{
    int i;
    size=0;
    limit=1<<10;
    for(i=0;i>1))!=0)continue;
               for(l=0;state[l]>1))!=0)continue;
                 if((state[l]&state[j])!=0)continue;// 判断当前行和上上行是否冲突
                 if(dp[i-1][k][l]+num[j]>dp[i][j][k])dp[i][j][k]=dp[i-1][k][l]+num[j];// dp[i][j][k] 存所有与之不冲突的dp[i-1][k][l]+num[j]的最大值

               }
            }
        }
    }

    int ans=0;
    for(i=0;state[i]ans)
            ans=dp[n][i][j];
        }
        return ans;
}
int main()
{
    in();
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0||m==0)
        {
            printf("0\n");
            continue;
        }

        init();
        
        int ans=solve();
        printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(状态压缩DP)