核发电站 (dp前缀优化)
大意: n个城市, m种核电站, 第i种假设要建在第x个城市, 必须满足[x−i,x+i]范围内无其他核电站, 求建核电站的方案数.
简单dp题, 设dp[i][j]为位置i建第j种核电站的方案数.
枚举上一个核电站的位置来转移, 有:
dp[i][1]=1+dp[i−2][1]+2∑k=1dp[i−3][k]+3∑k=1dp[i−4][k]+...
dp[i][j]=dp[i][j−1]−j−1∑k=1dp[i−j][k], j>1.
前缀优化一下即可O(nm).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include <iostream> #include <cstdio> #define REP(i,a,n) for(int i=a;i<=n;++i) #define PER(i,a,n) for(int i=n;i>=a;--i) using namespace std; const int P = 1e9+7; int dp[10010][110], s[10010]; int main() { int t; scanf ( "%d" , &t); REP(cas,1,t) { int n, m; scanf ( "%d%d" , &n, &m); REP(i,1,n) { int now = 1; dp[i][1] = 1; PER(j,1,i-2) { if (now==m) { (dp[i][1] += s[j]) %= P; break ; } (dp[i][1] += dp[j][now++]) %= P; } REP(j,2,m) dp[i][j] = (dp[i][j-1]-(i-j>0?dp[i-j][j-1]:0))%P; REP(j,2,m) (dp[i][j] += dp[i][j-1]) %= P; s[i] = (s[i-1]+dp[i][m])%P; } int ans = (s[n]+1)%P; if (ans<0) ans += P; printf ( "Case %d: %d\n" , cas, ans); } } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· 语音处理 开源项目 EchoSharp
· 《HelloGitHub》第 106 期
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 使用 Dify + LLM 构建精确任务处理应用