头像

欢迎来到我的博客

分享题解与总结

dp之swap交换法

dp之swap交换法

P3758 可乐 - 洛谷

有时dp可以用这种 新旧交替/滚动数组 的写法

框架是:

int cur=0,old=1; //为第一次swap做准备
for(int i=1;i<=t;++i){
    swap(cur,old); //交换
    for(int j=1;j<=n+1;++j){
        dp[cur][v]+=dp[old][j] //求cur数组
    }
}

代码:

const int N=35;
const int M=1e6+5;
const int MOD=2017;
vector<int> e[N];
int dp[2][N];

int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int n,m,u,v,t;
    cin>>n>>m;
    for(int i=0;i<m;++i){
        cin>>u>>v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    for(int i=1;i<=n;++i){ //超级源点
        e[i].push_back(n+1);
    }
    for(int i=1;i<=n+1;++i){ //统一添加自环
        e[i].push_back(i);
    }
    cin>>t;
    dp[0][1]=1;
    int cur=0,old=1;
    for(int i=1;i<=t;++i){
        swap(cur,old);
        for(int j=1;j<=n+1;++j) dp[cur][j]=0;
        for(int j=1;j<=n+1;++j){
            for(int v:e[j]) dp[cur][v]=((dp[cur][v]+dp[old][j])%MOD+MOD)%MOD;
        }
    }
    ll ans=0;
    for(int i=1;i<=n+1;++i){
        ans=((ans+dp[cur][i])%MOD+MOD)%MOD;
    }
    cout<<ans;
    return 0;
}

reference:

蓝桥杯官方书籍

posted @ 2026-08-27 21:22  king_steph1209  阅读(7)  评论(0)    收藏  举报