首页 > 其他分享 >轮廓线DP

轮廓线DP

时间:2024-11-15 15:20:14浏览次数:1  
标签:状态 typedef long 轮廓线 pair using DP define

更新日志

概念

类似于状态压缩DP,但我们储存的是轮廓线上的状态。

有些时候,也不需要进行状态压缩,而可以用某一点的状态代表一个区域的状态。

思路

轮廓线就是已经决策的与尚未决策的部分的分界线,我们储存分界线上已经决策过的所有节点的状态。

借图OI-wiki:

pic

图中最粗的那一条就是轮廓线。储存的状态可以为第三行前两个与第二行后两个。

直接上例题。

例题

HDU1400

骨牌覆盖,经典问题。

我们考虑状态,\(0\) 表示尚未被覆盖,\(1\) 表示已经被覆盖。

我们是逐格推进的。每次更新时,都只需要枚举这一格的轮廓线状态。(当前格视作已决策的情况下)

  • 当前格子状态为 \(0\)。
    那么只能不放。因此,由于要填满整个棋盘,它上面的格子必须已经被覆盖,也就是必须为 \(1\),可以用异或表示(因为二者在同一位上,且当前位为 \(0\))
    在下方代码中,\(t\) 表示当前所在格子编号,\(s\) 表示状态,\(j\) 表示横坐标。

    \[f[t][s]=f[t-1][s\oplus 1<<j] \]

  • 当前格子状态为 \(1\)。
    那么可以横着放,也可以竖着放。
    • 横着放,要求前一位必须为空(至少得有前一位,不能放出界)。同时,当前状态的前一位状态也应该是 \(1\),因为横着放必然也会盖上其左侧的格子。所以也可以使用异或表示。
      同时,这个格子的上面一个格子必须已经被覆盖了,由于这一位状态本来就是 \(1\),所以可以直接使用,无需改变状态。

      \[f[t][s]=f[t][s]+f[t-1][s\oplus 1<<j-1] \]

    • 竖着放,对于前一位就没有什么要求了,但是这一位的上一个格子必须为 \(0\),同理可得异或即可。

      \[f[t][s]=f[t][s]+f[t-1][s\oplus 1<<j] \]

初始化:第一行的前一行视作全部填满,其他状况均无可能。

答案:最后一行不能留空,答案就是 \(f[t][(1<<m)-1]\)。\(m\) 表示总列数。

代码
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef __int128 i128;
typedef double db;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<int,ll> pil;
typedef pair<ll,int> pli;
template <typename Type>
using vec=vector<Type>;
template <typename Type>
using grheap=priority_queue<Type>;
template <typename Type>
using lrheap=priority_queue<Type,vector<Type>,greater<Type> >;
#define fir first
#define sec second
#define pub push_back
#define pob pop_back
#define puf push_front
#define pof pop_front
#define chmax(a,b) a=max(a,b)
#define chmin(a,b) a=min(a,b)
#define dprint(x) cout<<#x<<"="<<x<<"\n"

const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7/*998244353*/;

const int N=11;

int n,m;
ll f[2][2<<N];
ll ans;

void solve(){
    if(n<m)swap(n,m);
    int i,wc;
    memset(f,0,sizeof(f));
    f[0][(1<<m)-1]=1;
    ans=0;
    for(i=0,wc=1;i<n;i++){
        for(int j=0;j<m;j++,wc^=1){
            for(int s=0;s<(1<<m);s++){
                if(s>>j&1){
                    f[wc][s]=f[wc^1][s^(1<<j)];
                    if(j>0&&(s>>j-1&1))f[wc][s]+=f[wc^1][s^(1<<j-1)];
                }else f[wc][s]=f[wc^1][s^(1<<j)];
            }
        }
    }
    cout<<f[wc^1][(1<<m)-1]<<"\n";
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    while(cin>>n>>m)solve();
    return 0;
}

LG1437

可以用最下侧的点状态表示其一整个倒三角的状态。

分别储存删除这个点的价值和使这个三角形为空的最大价值即可。

考虑从其右上角转移得到当前点,然后加上与它同列且在其上方的所有价值,代表删除这个点。

是这个三角形为空,可以先使它下面一个三角形为空,也可以删除当前节点,更新即可。

实时统计答案。

代码
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef __int128 i128;
typedef double db;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<int,ll> pil;
typedef pair<ll,int> pli;
template <typename Type>
using vec=vector<Type>;
template <typename Type>
using grheap=priority_queue<Type>;
template <typename Type>
using lrheap=priority_queue<Type,vector<Type>,greater<Type> >;
#define fir first
#define sec second
#define pub push_back
#define pob pop_back
#define puf push_front
#define pof pop_front
#define chmax(a,b) a=max(a,b)
#define chmin(a,b) a=min(a,b)
#define dprint(x) cout<<#x<<"="<<x<<"\n"

const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7/*998244353*/;

const int N=55;

int n,m;
int a[N][N];
ll s[N][N];
ll res[N][N][N*N];//使三角空
ll dlt[N][N][N*N];//删除这个三角
ll ans;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n-i+1;j++){
            cin>>a[i][j];
            s[i][j]=s[i-1][j]+a[i][j];
        }
    }
    //right->left down->up
    for(int j=n;j>=1;j--){
        for(int i=n-j+1;i>=0;i--){
            for(int k=i*(i+1)/2;k<=m;k++){
                dlt[i][j][k]=res[max(0,i-1)][j+1][k-i]+s[i][j];
                res[i][j][k]=max(res[i+1][j][k],dlt[i][j][k]);
                ans=max(ans,res[i][j][k]);
            }
        }
    }
    cout<<ans;
    return 0;
}

标签:状态,typedef,long,轮廓线,pair,using,DP,define
From: https://www.cnblogs.com/HarlemBlog/p/18548048

相关文章

  • 在 Windows 中,RDP(远程桌面协议)默认使用 3389 端口。如果你想通过 PowerShell 更改此端
    在Windows中,RDP(远程桌面协议)默认使用3389端口。如果你想通过PowerShell更改此端口为10010,你需要修改注册表设置并重启远程桌面服务。以下是使用PowerShell更改RDP端口为10010的步骤:步骤:以管理员身份运行PowerShell。执行以下命令修改注册表,修改RDP端口设置:p......
  • icloudpd
    icloudpd介绍:每天定时同步icloud照片下载到本地。https://github.com/boredazfcuk/docker-icloudpddocker启动后​chmod-R777iCloud​,意思是赋予iCloud文件夹最高权限执行sync-icloud.sh--Initialise​有效期默认为90天,过期之后就会停止同步,这也算苹果的一个安全......
  • 每日OJ题_牛客_计算字符串的编辑距离_DP_C++_Java
    目录牛客_计算字符串的编辑距离_DP题目解析C++代码Java代码牛客_计算字符串的编辑距离_DP计算字符串的编辑距离_牛客题霸_牛客网描述:Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换......
  • 状压 DP 做题记录
    1.普通状态压缩DPI.P1896[SCOI2005]互不侵犯\(f_{i,j,st}\)表示前\(i\)行中放置了\(j\)个国王,当前行状态为\(st\)的方案数。可以预处理出合法的状态与其popcount,转移时枚举当前行状态和上一行状态,合法就转移。constintN=20,inf=1e9,mod=998244353;constll......
  • TCP_UDP
    TCP,UDPFlood攻击原理TCPFlood攻击配置环境WindowsServer2016配置服务器管理器,创建一个Web服务器并开启该服务器功能kali配置vim/etc/network/interfacesifupeth0开启网络查看Kaliip信息:修改路由器信息:拓扑关系如下所示:GNS3中修改路由器R......
  • 基于UDP的tftp传输服务的客户端
    效果图下载上传:代码:#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<arpa/inet.h>#include<string.h>#include<unistd.h>#include<netinet/in.h>#include<stdlib.h>#include<......
  • GDPC-CSACTF Round2 WP Web篇
    先从简单的开始ezupload题目都把解题方法拍脸上了,随便上网找一个php一句话木马上传后拿webshell软件(我用的是蚁剑antsword)脸上就可以翻服务器了,最后在usr找到flag,比较搞笑的是我第一次出了点问题还以为要提权,经典把题目做难ezcmd同样是几乎送分题,跟一轮一样直接把PHP源码扔......
  • CodeCraft-21 and Codeforces Round 711 (Div. 2) F. Christmas Game【阶梯博弈、换根
    这道题目是比较经典的树上阶梯博弈。设一个点的深度是\(dep_i\),如果两个点\(i,j\)满足\(dep_i\not\equivdep_j\modk\),则两个点对答案的影响是完全独立的。我们可以把图拆分为\(k\)部分,并且按照原图中的祖先关系把新图连接为\(k\)棵树。对于一个点\(i\),在新图中的深度为\(dep_......
  • 如果在整个项目中 QTcpSocket 被多次引用,并且多个对象或类需要共享同一个 QTcpSocket
    如果在整个项目中QTcpSocket被多次引用,并且多个对象或类需要共享同一个QTcpSocket实例,那么使用QSharedPointer<QTcpSocket>是一个不错的选择。以下是使用QSharedPointer<QTcpSocket>的优点、注意事项以及一些替代方案的建议。为什么推荐使用QSharedPointer<QTcpSo......
  • Greenlight - Endpoints and Actions
    MethodURLPatternActionGET/v1/healthcheckShowapplicationhealthandversioninformationGET/v1/moviesShowthedetailsofallmoviesPOST/v1/moviesCreateanewmovieGET/v1/movies/:idShowthedetailsofaspecificmoviePA......