gym102361 G. Game on Chessboard(轮廓线dp)

题意:

在这里插入图片描述

解法:
把取走棋子的状态压缩为一条轮廓线,可以用长度为2n的二进制数表示每种轮廓线,
因为题目要求删除的棋子左下不能有其他棋子,
那么选择轮廓线从左上到右下,这样的话遇到10拐点(棋子)的时候,左下是没有棋子的.
合法的轮廓线只有C(2n,n),

10拐点表示当前位置上有棋子,单独删除进行状态转移,或者枚举另一个10拐点一起删除进行转移,
转移之后10拐点就需要变成01.

下面的是瞎写的:
3x3的网格dp过程中实际上看作4x4的(有虚行和虚列):
在这里插入图片描述
目标状态是将10全部消掉,轮廓线变为:
在这里插入图片描述

code:
#include <bits/stdc++.h>
using namespace std;
char ch[12][12];
int a[12][12];
int d[1<<24];
int n;
signed main(){
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++){
            scanf("%s",ch[i]);
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                scanf("%d",&a[i][j]);
            }
        }
        //0向右,1向下
        int e=(1<<n)-1;//终止状态
        int s=(e<<n);//起始状态
        //初始化
        for(int i=e;i<=s;i++)d[i]=1e9;
        d[s]=0;
        //
        for(int i=s;i>e;i--){
            if(__builtin_popcount(i)!=n||d[i]==1e9)continue;//跳过不合法状态
            int x=-1,y=0;
            for(int j=n*2-1;j-1>=0;j--){
                if(i>>j&1)x++;//维护坐标
                else y++;
                if((i>>j&1)&&!(i>>(j-1)&1)){//10拐点
                    d[i-(1<<(j-1))]=min(d[i-(1<<(j-1))],d[i]+(ch[x][y]!='.')*a[x][y]);//转移之后10变成01
                    //枚举另一个棋子
                    int nx=-1,ny=0;
                    for(int k=n*2-1;k-1>j;k--){
                        if(i>>k&1)nx++;
                        else ny++;
                        if((i>>k&1)&&!(i>>(k-1)&1)){//10拐点
                            if(ch[x][y]+ch[nx][ny]=='B'+'W'){
                                d[i-(1<<(j-1))-(1<<(k-1))]=min(d[i-(1<<(j-1))-(1<<(k-1))],d[i]+abs(a[x][y]-a[nx][ny]));//转移之后10变成01
                            }
                        }
                    }
                    //
                }
            }
        printf("%d\n",d[e]);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于PyTorch的Embedding和LSTM的自动写诗实验LSTM (Long Short-Term Memory) 是一种特殊的循环神经网络(RNN)架构,用于处理具有长期依赖关系的序列数据。传统的RNN在处理长序列时往往会遇到梯度消失或梯度爆炸的问题,导致无法有效地捕捉长期依赖。LSTM通过引入门控机制(Gating Mechanism)和记忆单元(Memory Cell)来克服这些问题。 以下是LSTM的基本结构和主要组件: 记忆单元(Memory Cell):记忆单元是LSTM的核心,用于存储长期信息。它像一个传送带一样,在整个链上运行,只有一些小的线性交互。信息很容易地在其上保持不变。 输入门(Input Gate):输入门决定了哪些新的信息会被加入到记忆单元中。它由当前时刻的输入和上一时刻的隐藏状态共同决定。 遗忘门(Forget Gate):遗忘门决定了哪些信息会从记忆单元中被丢弃或遗忘。它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 输出门(Output Gate):输出门决定了哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。同样地,它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 LSTM的计算过程可以大致描述为: 通过遗忘门决定从记忆单元中丢弃哪些信息。 通过输入门决定哪些新的信息会被加入到记忆单元中。 更新记忆单元的状态。 通过输出门决定哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。 由于LSTM能够有效地处理长期依赖关系,它在许多序列建模任务中都取得了很好的效果,如语音识别、文本生成、机器翻译、时序预测等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值