社区讨论

前缀和求条

AT_dp_mCandies参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lokurq5t
此快照首次捕获于
2023/11/05 10:27
2 年前
此快照最后确认于
2023/11/05 11:54
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace Testify{
    int read(){
        int f(1),x(0);
        char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
        for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
        return f*x;
    }
    void WritE(int x){
        if(x<0) putchar('-'),x=-x;
        if(x>9) WritE(x/10);
        putchar(x%10+48);
    }
    void write(int x){
        WritE(x);
        puts("");
    }
    void Write(int x){
        WritE(x);
        putchar(' ');
    }
}
using namespace Testify;
int n,m,K;
const int N=1e5+5;
const int mod=1e9+7;
int dp[105][N],a[N];
int sum[105][N];
signed main(void){
    n=read(),K=read();
    for(register int i=1;i<=n;i++){
        a[i]=read();
    }
    dp[1][0]=sum[1][0]=1;
    for(register int i=1;i<=min(a[1],K);i++){
        dp[1][i]=1;
        sum[1][i]=(sum[1][i-1]+dp[1][i])%mod;
    }
    int Sum=a[1];
    for(register int i=2;i<=n;i++){
        Sum+=a[i];
        dp[i][0]=dp[i-1][0];
        sum[i][0]=dp[i-1][0];
        for(register int j=1;j<=min(K,Sum);j++){
            // cerr<<j<<" "<<j-min(a[i],j)<<endl;
            if(j-min(a[i],j)==0){
                dp[i][j]=(dp[i][j]+sum[i-1][j])%mod;
            }
            else{
                dp[i][j]=(dp[i][j]+sum[i-1][j]-sum[i-1][j-min(a[i],j)-1]+mod)%mod;
            }
            // for(register int k=0;k<=a[i]&&k<=j;k++){
            //     cerr<<j-k<<" ";
            //     dp[i][j]=(dp[i][j]+dp[i-1][j-k])%mod;
            // }
            // cerr<<endl;
            sum[i][j]=(sum[i][j-1]+dp[i][j])%mod;
        }
    }
    // cerr<<endl;
    // for(register int i=0;i<=n;i++){
    //     for(register int j=0;j<=n;j++){
    //         cerr<<dp[i][j]<<" ";
    //     }
    //     cerr<<endl;
    // }
    // cerr<<endl;
    // for(register int i=0;i<=n;i++){
    //     for(register int j=0;j<=n;j++){
    //         cerr<<sum[i][j]<<" ";
    //     }
    //     cerr<<endl;
    // }
    int ans=0;
    write(dp[n][K]);
    return 0;
}

注释掉的是对的改成前缀和九不对不知道为什么

回复

1 条回复,欢迎继续交流。

正在加载回复...