POJ 3046 DP

必须优化dp数组,因为每次更新必须用到前一阶段和本阶段的数据,不能简单的把数组改成一维,我开了两个数组滚动使用

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxv=1e5+30;
int mod=1000000;
int t,a,s,b;
int dp1[maxv];
int dp2[maxv];
int f[1005];
int main(){
    freopen("in","r",stdin);
    cin>>t>>a>>s>>b;
    int kk;
    for(int i=1;i<=a;i++){ 
    scanf("%d",&kk);
    f[kk]++;
    }
    memset(dp1,0,sizeof dp1);
    dp1[0]=1;
    int *now=dp2,*pre=dp1;
    for(int i=1;i<=t;i++){ 
        for(int j=0;j<=a;j++){
            now[j]=((now[j-1]+pre[j])%mod-(j-1-f[i]>=0?pre[j-1-f[i]]:0)+4*mod)%mod;
        }
        swap(now,pre);
    }
    int ans=0;
    for(int i=s;i<=b;i++) ans=(pre[i]+ans)%mod;
    cout<<ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/Cw-trip/p/4464194.html