zoukankan      html  css  js  c++  java
  • poj 1185 炮兵阵地 状压dp

    分析:因为每一行的状态和上两行的状态有关,因此dp[i][r][p]代表第i行状态为state[r]以及第i-1行为state[p]时的最大炮台数目;

    状态是有限的,可以dfs出来

    代码:

    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #include<deque>
    //#define DEBUG  //todo
    using namespace std;    int nn;
    int ans;
    int m,n,cnt,bin[11],dp[110][110][110],state[100],t,gra[110],_cnt,sum[110];
    char c;
    void ini()
    {
        t=0;
        cnt=0;
        cin>>m>>n;
        for(int i=1;i<=m;i++){
            getchar();
            for(int j=1;j<=n;j++){
                cin>>c;
                if(c=='P') gra[i]+=1<<(n-j);
            }
        }
    }
    void dfs(int i)
    {
        if(i>=n) {
            state[++cnt]=t; sum[cnt]=_cnt;
            return; }
        for(int j=i+1;;j++){
            if(j>n) { dfs(j); break;}
            if(j-i>=3 || i==0) { 
                t+=1<<(j-1);
                _cnt++;
                dfs(j);
                t-=1<<(j-1);
                _cnt--;
            }
        }
    }
    void work()
    {
        dfs(0);
        memset(dp,-1,sizeof(dp));
        for(int p=1;p<=cnt;p++){
            for(int q=1;q<=cnt;q++){
                if((state[p]&gra[1])==state[p] && state[q]==0){
                    dp[1][p][q]=sum[p];
                }
            }
        }
        for(int i=2;i<=m;i++){
            for(int r=1;r<=cnt;r++){
                if((gra[i]&state[r])!=state[r]) continue;
                for(int p=1;p<=cnt;p++){
                    if((state[p]&state[r])!=0) continue;
                    for(int q=1;q<=cnt;q++){
                        if(dp[i-1][p][q]==-1 || (state[r]&state[q])!=0) continue;
                        dp[i][r][p]=max(dp[i][r][p],dp[i-1][p][q]+sum[r]);
                    }                
                }
            }
        }
        for(int r=1;r<=cnt;r++){
            for(int p=1;p<=cnt;p++){
                ans=max(dp[m][r][p],ans);
            }
        }
        cout<<ans<<endl;
    }
    int main()
    {
        ini();
        work();
    #ifdef DEBUG
        cin>>nn;
    #endif
        return 0;
    }
    //dp[i][r][p]=max(dp[i-1][p][_p]+sum[r]);
  • 相关阅读:
    Requests接口测试(五)
    Requests接口测试(四)
    Requests接口测试(一)
    软件测试杂谈(学习思路、学习方法、面试技巧、后期发展、职业规划等)
    Requests接口测试(三)
    Requests接口测试(二)
    Python基础入门-列表解析式
    Python基础入门-集合
    Jmeter接口测试-完成任务API
    Jmeter接口测试-基于nodejs的to do list项目说明
  • 原文地址:https://www.cnblogs.com/au-xiaotian/p/3457498.html
Copyright © 2011-2022 走看看