Processing math: 100%

核发电站 (dp前缀优化)

大意: n个城市, m种核电站, 第i种假设要建在第x个城市, 必须满足[xi,x+i]范围内无其他核电站, 求建核电站的方案数.

 

简单dp题, 设dp[i][j]为位置i建第j种核电站的方案数.

枚举上一个核电站的位置来转移, 有:

dp[i][1]=1+dp[i2][1]+2k=1dp[i3][k]+3k=1dp[i4][k]+...

dp[i][j]=dp[i][j1]j1k=1dp[ij][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);
    }
}

 

posted @   uid001  阅读(335)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 深入理解 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 构建精确任务处理应用
点击右上角即可分享
微信分享提示