牛客--64--F
关键
这个题目很值得学习呀!
看着是不能记录所有的状态,但是可以映射一下,然后就是直接线性dp了
代码
#include <bits/stdc++.h> using namespace std; const int M=2e6+5; const int mod=998244353; using pii=pair<int,int>; inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f; } void add(int &x,int y) { x=(x+y)%mod; } bool g[M][4]; int f[M][4]; unordered_map<int,int>mp; vector<int>v; vector<pii>node; int main() { int n=read(),m=read(); while(m--) { int x=read(),y=read(); v.push_back(y); v.push_back(y+1); v.push_back(min(n,y+2)); node.push_back({x,y}); } v.push_back(1); v.push_back(n); sort(v.begin(),v.end()); int len=v.erase(unique(v.begin(),v.end()),v.end())-v.begin(); for(int i=0;i<len;i++)mp[v[i]]=i+1; for(auto [x,y]:node)g[mp[y]][x]=1; f[1][1]=1; //for(auto [x,y]:mp)cout<<x<<' '<<y<<endl; for(int i=1;i<len;i++) { for(int j=1;j<=3;j++) { if(g[i][j]) { //cout<<i<<' '<<j<<endl; add(f[min(i+2,len)][j],f[i][j]); add(f[i+1][max(1,j-1)],f[i][j]); add(f[i+1][min(3,j+1)],f[i][j]); } else add(f[i+1][j],f[i][j]); } //cout<<f[i][1]<<' '<<f[i][2]<<' '<<f[i][3]<<endl; } for(int i=1;i<=3;i++)cout<<f[len][i]<<'\n'; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现