首页 > 其他分享 >【知识】插头DP

【知识】插头DP

时间:2024-12-08 19:09:42浏览次数:5  
标签:插头 return cur int LL 知识 state find DP

#include <iostream>
#include <cstring>
typedef long long LL;
using namespace std;
const int N = 50000, M = N*2 + 7;

int n, m,end_x,end_y;
int g[20][20], q[2][N], cnt[N];

int h[2][M];
LL v[2][M];

int find(int cur,int x){
    int t = x % M;
    while(h[cur][t]!=-1&&h[cur][t]!=x) 
        if(++t==M)
            t = 0;
    return t;
}

void insert(int cur,int state,LL w){
    int t = find(cur, state);
    if(h[cur][t]==-1){
        h[cur][t] = state, v[cur][t] = w;
        q[cur][++cnt[cur]] = t;
    }
    else
        v[cur][t] += w;
}
int get(int state,int k){       //求四进制第 k 位数字
    return state >> k * 2 & 3;  
}

int set(int k,int v){   //构造四进制的第 k 位数字为 v 的数
    return v * (1 << k * 2);
}

int main(){
    cin >> n >> m;
    for(int i = 1; i <= n;i++){
        char str[20];
        scanf("%s", str + 1);
        for (int j = 1; j <= m;j++)
            if(str[j]=='.')
                g[i][j] = 1, end_x = i, end_y = j;
    }
    LL res=0;
    memset(h, -1, sizeof(h));
    int cur = 0;
    insert(cur, 0, 1);
    for (int i = 1; i <= n;i++){
        for (int j = 1; j <= cnt[cur];j++)
            h[cur][q[cur][j]] <<= 2;
        for (int j = 1; j <= m;j++){
            int last = cur;
            cur ^= 1, cnt[cur] = 0;
            memset(h[cur], -1, sizeof(h[cur]));
            for (int k = 1; k <= cnt[last]; k++){
                int state = h[last][q[last][k]];
               
                LL w = v[last][q[last][k]];
                int x = get(state, j - 1), y = get(state, j);
                if(!g[i][j]){
                    if(!x&&!y) 
                         insert(cur, state, w);
                }
                else if(!x&&!y){
                    if(g[i+1][j]&&g[i][j+1])
                        insert(cur, state + set(j - 1, 1) + set(j, 2), w);
                }
                else if(!x&&y){
                    if(g[i][j+1])
                        insert(cur, state, w);
                    if(g[i+1][j])
                        insert(cur, state + set(j - 1, y) - set(j, y), w);
                }
                else if(x&&!y){
                    if(g[i][j+1])
                        insert(cur, state - set(j - 1, x) + set(j, x), w);
                    if(g[i+1][j])
                        insert(cur, state, w);
                }
                else if(x==1&&y==1){
                    for (int u = j + 1,s = 1;; u++){
                        int z = get(state, u);
                        if(z==1)
                            s++;
                        else if(z==2){
                            if(--s==0){
                                insert(cur,state-set(j-1,x)-set(j,y)-set(u,1),w);
                                break;
                            }
                        }
                    }
                }
                else if(x==2&&y==2){
                    for (int u = j - 2,s=1;;u--){
                        int z = get(state, u);
                        if(z==2)
                            s++;
                        else if(z==1){
                            if(--s==0){
                                insert(cur, state - set(j - 1, x) - set(j, y) + set(u, 1), w);
                                break;
                            }
                        }
                    }
                }
                else if(x==2&&y==1){
                    insert(cur, state - set(j - 1, x) - set(j, y), w);
                }
                else if(i==end_x&&j==end_y)
                    res += w;
            }
        }
    }
    cout << res << endl;
    return 0;
}

标签:插头,return,cur,int,LL,知识,state,find,DP
From: https://www.cnblogs.com/fanrunze/p/18593677

相关文章

  • dpdk fbarray
    概述fbarray是一个固定大小的多进程共享的内存块数组。structrte_fbarray{ charname[RTE_FBARRAY_NAME_LEN];/**<nameassociatedwithanarray*/ unsignedintcount;/**<numberofentriesstored*/ unsignedintlen;/**<current......
  • Nginx + WordPress 的 fastcgi_cache 配置
    NginxWeb缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令手动清除缓存;但是我们可以通过Nginx的模块ngx_cache_purge清除指定URL的缓存。proxy_cache缓存后端服务器的内容,可能是任何内容,包括静态的和动态,减少了nginx与后端通信的次数,节省了传输时间和后端......
  • 小鹅通知识付费系统如何助力内容变现?
    在探讨教育与软件行业的深度融合时,我们不可忽视知识付费和在线教育对传统教育生态的影响。尤其是在当前的技术环境下,知识付费在线教育系统作为重要的工具,正日益受到教育机构和教育者的青睐。今天我们将聚焦于一家在这方面颇有建树的企业——小鹅通。尽管本文不着重推广特定平台或......
  • 如何用Muu云课堂源码迅速搭建知识付费平台
    随着教育产业和数字化技术的日益融合,教育行业正在发生翻天覆地的变化。在这一浪潮中,在线教育和知识付费系统成为了众多教育机构与老师探索的新路径。尤其是在当今日益复杂而多样化的市场需求中,老师们如何将自己的专业内容高效传达给学生,并实现变现?这时,诸如Muu云课堂这样的一站式知......
  • ThreeJS入门(185):THREE.OrbitControls 知识详解,示例代码
    作者:还是大剑师兰特,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,webgl,ThreeJS,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。查看本专栏目录-本文是第185篇入门文章......
  • ThreeJS入门(182):THREE.FirstPersonControls 知识详解,示例代码
    作者:还是大剑师兰特,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,webgl,ThreeJS,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。查看本专栏目录-本文是第182篇入门文章......
  • 知识付费课堂如何借力抖音?新机遇还是挑战?
    在当今的数字时代,教育与新媒体的融合不断深化,使得教育行业呈现出前所未有的机遇与挑战。随着短视频平台如抖音的普及和活跃度上升,教育从业者开始寻求更广泛的用户接触面及更有效的变现途径。而在这其中,一款精心打造的知识付费课堂系统便能在连接师生、提高效率、扩大市场方面起到......
  • 【知识】树链剖分
    树链剖分思想:将一颗树转换成一段序列,满足树中任意一条路径$\Leftrightarrow$不超过\(\logn\)段区间概念:重儿子​ 一个点的重儿子为它的儿子的子树节点个数最多的那个点。​ 如有多个,任选一个。轻儿子不是重儿子的都为轻儿子重边与重儿子相连的边轻边与......
  • Chromium CDP 开发(六):注册自己的指令(下)
    引言在这一章节中,我们将详细讲解如何将新定义的TimerSend指令和TimerLog事件添加到项目的inspector_protocol_config.json文件中,从而使这些功能能够在CDP(ChromeDevToolsProtocol)中被识别并正常使用。inspector_protocol_config.json是CDP的核心配置文件之一,......
  • 如何从0到1搭建高效知识付费系统
    知识付费系统作为教育和内容提供领域的关键技术,已在国内外多个行业广泛应用。从知识的分发方式来看,知识付费系统不仅仅是将信息传递给学生,更是一种全新的教育商业模式,极大地促进了教育资源的流通。通过构建高效的在线销售平台,知识产品得以更便捷、高效地触及消费者。在目前的应......