【状态设计优化DP】ABC307 E

news2025/4/17 11:19:21

E - Distinct Adjacent (atcoder.jp)

题意:

思路:

组合问题,考虑DP或组合数

组合数不好考虑,我们去考虑DP

因为是个环,我们把环拆成一条链,然后加一个N+1,颜色和起点1相同,在这条链上DP

先考虑暴力DP

设dp[i][x]表示第i个元素,选的颜色为x的方案数

这样转移方程非常好转移:

dp[i][x]+=dp[i-1][y],(if x!=y && i!=N)

dp[i][x]+=dp[i-1][y],(if x!=y && i==N && x!=a)

但是这样设计既会爆时间也会爆空间,因此我们考虑重新设计状态

注意到,我们在转移的过程中

当i != N时,我们关注的只是和前面那个颜色是否相同

当i == N时,我们关注的是和前面那个颜色是否相同 + 和第一个元素是否相同

 因此存在着很多无效状态,我们只需要记录和第一个元素是否相同即可

题解原话是这么说的:

But on second thought, we observe that we do not need to distinguish all integers assigned to the last person, but only whether the last integer equals the one given to the first person.

那么我们可以这样设计状态

设dp[i][0]表示第 i 个元素,和第一个元素颜色不同的方案数

dp[i][1]表示第 i 个元素,和第一个元素颜色相同的方案数

那么就可以转移了

感觉这种状态优化的DP应该先考虑暴力DP怎么写,然后再去看在转移过程中实际需要记录的维数是什么就可以

#include <bits/stdc++.h>

#define int long long

using namespace std;

const int mxn=1e6+10;
const int mxe=2e5+10;
const int mod=998244353;

int N,M;
int dp[mxn][2];

void solve(){
    cin>>N>>M;
    dp[1][1]=M;
    for(int i=2;i<=N;i++){
        dp[i][1]=dp[i-1][0];
        dp[i][0]=(dp[i-1][0]*(M-2)%mod+dp[i-1][1]*(M-1)%mod)%mod;
    }
    cout<<dp[N][0]<<'\n';
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int __=1;//cin>>__;
    while(__--)solve();return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/741455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

天台玻璃折叠门可实现室内外空间的无缝连接

天玻璃折叠门是指安装在天台上的可折叠开合的玻璃门&#xff0c;可用于将室外空间与室内空间进行隔离或连接。设计天台玻璃折叠门时需要注意以下几点&#xff1a; 1. 结构稳固性&#xff1a;选择坚固、稳定的材料和结构设计&#xff0c;确保门体在风力和其他外力作用下不易摇晃…

如何规范的设计数据库表

前言对于后端开发同学来说&#xff0c;访问数据库&#xff0c;是代码中必不可少的一个环节。系统中收集到用户的核心数据&#xff0c;为了安全性&#xff0c;我们一般会存储到数据库&#xff0c;比如&#xff1a;mysql&#xff0c;oracle等。后端开发的日常工作&#xff0c;需要…

制作搭建宠物商城小程序,打造便捷的宠物购物体验

随着宠物市场的不断发展&#xff0c;宠物商城小程序成为了满足宠物爱好者需求的重要工具。在现代社会&#xff0c;宠物已经成为人们生活中不可或缺的一部分。作为宠物爱好者&#xff0c;我们对于宠物食品、用品、医疗保健品等需求日益增长。而宠物商城小程序则为我们提供了一个…

python_day5_file

open()打开函数&#xff1a; f open(name,mode,encoding) name:要打开的目标文件名 mode:访问模式&#xff1a;只读r、写入w、追加a 等 encoding:编码格式&#xff0c;常为UTF-8 f open("D:\Test.txt", "r", encoding"UTF-8") print(type(f))r…

Dbeaver 显示字段备注信息

一、全局设置显示字段描述

@所有人,酷雷曼年中答卷,请查收!

2023 酷雷曼VR年中答卷 顺势而行 携手共赢 七月既至&#xff0c;年过已半。 半年来&#xff0c; 我们持续以优质的产品研发、 专业的客户服务、 不断交付的技术方案&#xff0c; 将那些关于VR的美好向往&#xff0c; 变成真实可感的确定&#xff0c; 让每一种相信&am…

Vue+element实现el-table行内编辑并校验

el-table行内编辑情况情况概要&#xff1a;之前在开发过程中对于element数据的新增&#xff0c;修改&#xff0c;删除。一般直接结合el-form使用。也就是新增的时候点新增然后出来一个弹框&#xff0c;里面嵌套一个表单&#xff0c;然后保存就好了。这次项目中要求所有的新增&a…

如何学习编写安全的PHP代码? - 易智编译EaseEditing

学习编写安全的PHP代码是保证应用程序安全的重要一环。下面是几个建议来帮助你学习编写安全的PHP代码&#xff1a; 学习安全编程原则&#xff1a; 了解常见的安全漏洞类型&#xff0c;如跨站脚本攻击&#xff08;XSS&#xff09;、SQL注入、跨站请求伪造&#xff08;CSRF&…

如何刷新对黑客的认识?

黑客一般有10种类型 1、白帽黑客 白帽黑客是指通过实施渗透测试&#xff0c;识别网络安全漏洞&#xff0c;为政府及组织工作并获得授权或认证的黑客。他们也确保保护免受恶意网络犯罪。他们在政府提供的规章制度下工作&#xff0c;这就是为什么他们被称为道德黑客或网络安全专…

springboot项目中引入本地依赖jar包,并打包到lib文件夹中

1.springboot项目中引入本地依赖jar包&#xff0c;并打包到lib文件夹中 描述&#xff1a;下载了第三方相关jar包后&#xff0c;项目中引入本地jar&#xff0c;测试环境正常&#xff0c;打包线上报错提示为找到该jar 原因&#xff1a;应该在/WEB-INF/lib/xxx.jar&#xff0c;被…

vite-plugin-mock配置报错“localEnabled”不在类型”ViteMockOptions”中

vue3vite安装vite-plugin-mock之后配置报错&#xff1a; “localEnabled”不在类型”ViteMockOptions”中。 在vite.config.ts中共添加viteMockServe({ localEnabled: command ‘serve’, }),之后报了一下错误&#xff1a; 解决方法&#xff1a;与vite-plugin-mock版本有关&a…

揭示Android黑客之道:通过逆向工程揭开HTTPS流量

抓包是指在计算机网络中&#xff0c;通过监听网络流量并捕获通信数据包的过程。在网络通信中&#xff0c;数据以数据包的形式在网络上进行传输&#xff0c;每个数据包包含了源地址、目标地址、协议信息以及实际的数据内容。 抓包可以帮助我们了解网络通信的细节&#xff0c;包…

linux开发工具:Git

文章目录 1&#xff1a;Git简介2&#xff1a;Git简明指南2.1&#xff1a;创建新仓库2.2&#xff1a;检出仓库2.3&#xff1a;工作流2.4&#xff1a;添加和提交2.5&#xff1a;推送改动2.6&#xff1a;分支2.7&#xff1a;更新与合并2.8&#xff1a;标签2.9&#xff1a;替换本地…

STM32 主从蓝牙模块配置

前言&#xff1a; 最近在调试小车的时候&#xff0c;突然想要用两个蓝牙进行单片机和电脑的交互&#xff0c;之前一直用的都是从机的蓝牙。这里因为需要双机通信&#xff0c;所以也就顺便查询了一些资料&#xff0c;了解一下主从蓝牙模块的使用&#xff0c;以及双机通信的一些使…

在Linux中传输文件文件夹的10个scp命令

scp 命令的基本语法 下面的命令将读作 copy source_file_name进入destination_folder在destination_host使用username account。 > scp source_file_name usernamedestination_host:destination_folder里面有很多参数scp你可以使用的命令。以下是可能在日常使用中使用的参数…

【最短路+状压】CF1846 G

Problem - G - Codeforces 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>//#define int long longusing namespace std;const int mxn1e610; const int mxv1e610; const int mxe2e310; const int mod1e97; const int Inf0x3f3f3f3f;stru…

MOSS-RLHF实现大模型和人类价值观对齐

以 ChatGPT 为代表的大型语言模型&#xff08;LLM&#xff09;在各项任务上的高效表现彰显了其广阔发展前景。然而&#xff0c;大模型回复与人类价值偏好经常存在不一致问题。 如何让大模型更好的与人类价值观对齐&#xff0c;理解语言背后的含义&#xff0c;生成更具 “人情味…

elementPlus 树滚动到指定位置

根据当前选中id(colorsid)滚动到具体位置 参考如下&#xff1a; [element-ui] el-tree 滚动到指定选中的位置_element plus el-tree 滚轮定位_533_的博客-CSDN博客

open3d实现搜索在一个球内部的点云

目录 写在前面原理代码结果参考完 写在前面 1、本文内容 给定一个点云P和一个圆心为center&#xff0c;半径为r的球&#xff0c;搜索出P中属于球内的点 2、平台/环境 使用open3d, cmake&#xff0c;适用windows/linux 3、转载请注明出处&#xff1a; https://blog.csdn.net/q…

【代理模式】JDK动态代理示例代码

简介 JDK动态代理是一种基于JDK自带的Proxy类和InvocationHandler接口的代理方式。它可以在运行时动态地创建一个代理对象&#xff0c;该代理对象可以代替真实对象执行某些操作&#xff0c;从而实现对真实对象的代理。 与Java静态代理相比&#xff0c;JDK动态代理具有更高的灵…