首页 > 其他分享 >第三周题单

第三周题单

时间:2023-07-27 18:44:17浏览次数:38  
标签:pre const int 第三周 num now dp 题单

互不侵犯KING

思路:dp[i][j][k]表示前i行,且已经用了j个国王,且第i行的摆放状态为k(二进制);

dp[i][j][k]=dp[i-1][ j-num[now]][pre],now表示第i行的状态,pre表示上一行的状态,num[i]维护一行的状态为i的国王数量,且需保证now和pre满足为相邻行的条件

#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=600+5,INF=0x3f3f3f3f,Mod=1e9+7,mod=998244353;
const int inf=0x3f3f3f3f3f3f;
const double eps=1e-6;
const int dx[4]={-1,0,1,0};
const int dy[4]={0,1,0,-1};

int n,k,num[N],ok[N];
int dp[10][N][N];
void init(){
    for(int i=0;i<(1<<n);++i){
        if(!(i&(i<<1))){
            ok[i]=true;
            int t=i;
            while(t){
                num[i]+=(t&1);
                t>>=1;
            }
            dp[1][num[i]][i]=1;
        }
    }
}
void solve(){
    cin>>n>>k;
    init();
    for(int i=2;i<=n;++i)
        for(int j=0;j<=k;++j)
            for(int now=0;now<(1<<n);++now){
                if(!ok[now]||num[now]>j)continue;
                for(int pre=0;pre<(1<<n);++pre){
                    if(!ok[pre]||num[pre]>(j-num[now]))continue;
                    if((pre&now)||(pre&(now<<1))||(pre&(now>>1)))continue;
                    dp[i][j][now]+=dp[i-1][j-num[now]][pre];
                }
            }
    int ans=0;
    for(int i=0;i<(1<<n);++i){
        ans+=dp[n][k][i];
    }
    cout<<ans;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;

    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
View Code

 炮兵阵地

思路:dp[i][j][k]表示前i行的状态,且第i行的状态为ok[j],第i-1的状态为ok[k],枚举i、i-1、i-2行的状态j1、j2、j3,满足相邻行的条件且放大炮的位置不是山地即更新 dp[i][j1][j2]=max(dp[i][j1][j2],dp[i-1][j2][j3]);

初始时预处理好一行中存在的所有放炮的可行情况,用ok存;并且用mp存山地的位置

#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
typedef pair<int,int>PII;

typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=100+5,INF=0x3f3f3f3f,Mod=1e9+7,mod=998244353;
const int inf=0x3f3f3f3f3f3f;
const double eps=1e-6;
const int dx[4]={-1,0,1,0};
const int dy[4]={0,1,0,-1};

int n,m,num[N],ok[N];
int dp[N][N][N];
int mp[N];
void init(){

}
void solve(){
    cin>>n>>m;
    for(int i=1;i<=n;++i){
        string s;cin>>s;
        for(int j=0;j<m;++j){
            if(s[j]=='H')mp[i]|=(1<<j);
        }
    }
    int cnt=0;
    auto count=[](int x){
        int sum=0;
        while(x){
            if(x&1)sum++;
            x>>=1;
        }
        return sum;
    };
    for(int i=0;i<(1<<m);++i){
        if(!(i&(i<<2))&&!(i&(i<<1))){
            num[cnt]=count(i);
            ok[cnt++]=i;
        }
    }
    for(int i=0;i<cnt;++i){
        if(!(mp[1]&ok[i])){
            dp[1][i][0]=num[i];
        }
    }
    for(int i=2;i<=n;++i){
        for(int j1=0;j1<cnt;++j1){
            if(ok[j1]&mp[i])continue;
            for(int j2=0;j2<cnt;++j2){
                if(ok[j2]&mp[i-1]||ok[j2]&ok[j1])continue;
                for(int j3=0;j3<cnt;++j3){
                    if((ok[j3]&mp[i-2])||(ok[j3]&ok[j2])||(ok[j3]&ok[j1]))continue;
                    dp[i][j1][j2]=max(dp[i][j1][j2],dp[i-1][j2][j3]+num[j1]);
                }
            }
        }
    }
    int ans=0;
    for(int i=0;i<cnt;++i)
        for(int j=0;j<cnt;++j)ans=max(dp[n][i][j],ans);
    cout<<ans;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;

    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
View Code

 

标签:pre,const,int,第三周,num,now,dp,题单
From: https://www.cnblogs.com/bible-/p/17584984.html

相关文章

  • 贪心(不同情况下有不同策略)题单报告
    书接上回。感觉这个标题起得云里雾里的颇有上次讲的“反悔自动机”的奇妙风范,坏了会回旋镖插我自己身上了(感觉这样的贪心很厉害。什么叫不同情况下有不同策略呢?就是说你要分讨,分讨的每一种情况我们都要保证这是当前的最优解。这听起来是不是还是很扯,其实这是为了方便我自己看的......
  • 贪心(反悔贪心)题单报告
    Democy爷给了一份贪心的题单,但是由于我是小笨比,所以很多题我都不是很会做,现在来简单写一份总结,加强一下印象qwq。首先什么叫贪心?贪心就是我每次都选择一个最大值。比如说我现在有\(n\)个物品,每个物品都有一个价值,我们可以选\(k\)件物品,我们怎么样让选择的价值和最大呢?傻子......
  • 第二周训练题单
    多项式输出小细节比较多#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongint32_tmain(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);intn;cin>>n;for(intx,i=n;i>=0;i--){......
  • 第三周
    1、yum私有仓库的实现及博客输出基于eple的私有yum源(1)在10.0.0.8主机上配置好yum仓库(2)安装httpd,并开启httpd服务[root@rocky9~]#dnf-yinstallhttpd#(输出结果省略…)[root@rocky9~]#systemctlenable--nowhttpdCreatedsymlink/etc/systemd/system/multi-user......
  • 第三周
    作业yum私有仓库的实现及博客输出服务端配置:[MIDP-PUB-VM-E2-YUM001~]#yuminstall-yhttpd[MIDP-PUB-VM-E2-YUM001~]#systemctlenable--nowhttpd#挂载光盘,创建Base仓库目录并将光盘中的软件包复制到Base仓库目录中[MIDP-PUB-VM-E2-YUM001~]#mount/dev/sr0/mnt[M......
  • 7.22第三周总结
    这个星期,做了一下小活动。月底开始了我的暑期实践活动。最大的感受是,这个社会上有不少人有很大的毛病,但是与人为善的人要更多写。一些公司的白领,住在高档小区的剧名,素质都很高,餐品送达后会道谢,但是在住在路边简陋的屋子了的人对配送员的态度就不好,总是挑三拣四,可见人之间的距离还......
  • 暑假第三周总结
    交代一下最近的动态,今天是回家的第二周了,我找到了一份暑假工,开始一边打工赚钱,一边减肥的生活。在回家的这段时间里面,我重新学习了一下尚硅谷的javaweb教程,在视频讲解中,我学习到了很多之前不会的内容,也开始逐渐减少对jsp文件的依赖,开始学习servlt的相关内容(之前对于这方面的认知仅......
  • 第三周总结
      这周去青岛旅游了。。。^.^ ......
  • 暑假第三周
    [湖湘杯2018]Replace先脱壳直接定位到加密函数提取byte_40150,byte_402151和byte_4021A0数据,照着写解密脚本,直接爆破expdata=[0x32,0x61,0x34,0x39,0x66,0x36,0x39,0x63,0x33,0x38,0x33,0x39,0x35,0x63,0x64,0x65,0x39,0x36,0x64,0x36,0x64......
  • 省选计划(第三周)
    知识回顾:巩固:概率DP,错排,组合数深入研究:组合数,后缀数组,tarjan,2-SAT简单了解/没学明白:练题:[ABC280F]PayorReceive概率DP。定义\(f_i\)为把怪物打成i滴血的期望攻击次数。令\(p=\frac{p}{100}\)。则\(f_i=f_{i+2}\cdotp+f_{i+1}\cdot(1-p)+1\)。最终......