【历届试题 波动数列 】(01背包,滚动数组)

网友投稿 261 2022-11-23

【历届试题 波动数列 】(01背包,滚动数组)

时间限制:1.0s 内存限制:256.0MB

问题描述

观察这个数列:

1 3 0 2 -1 1 -2 …

这个数列中后一项总是比前一项增加2或者减少3。

栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a或者减少b的整数数列可能有多少种呢?

输入格式

输入的第一行包含四个整数 n s a b,含义如前面说述。

输出格式

输出一行,包含一个整数,表示满足条件的方案数。由于这个数很大,请输出方案数除以100000007的余数。

样例输入

4 10 2 3

样例输出

2

样例说明

这两个数列分别是2 4 1 3和7 4 1 -2。

数据规模和约定

对于10%的数据,1<=n<=5,0<=s<=5,1<=a,b<=5;

对于30%的数据,1<=n<=30,0<=s<=30,1<=a,b<=30;

对于50%的数据,1<=n<=50,0<=s<=50,1<=a,b<=50;

对于70%的数据,1<=n<=100,0<=s<=500,1<=a, b<=50;

对于100%的数据,1<=n<=1000,-1,000,000,000<=s<=1,000,000,000,1<=a, b<=1,000,000。

分析:比较容易写的是dfs 但是数据太大,只能得20分就T了

TLE【dfs】20分代码:

#include using namespace std;#define mem(a,n) memset(a,n,sizeof(a))#define memc(a,b) memcpy(a,b,sizeof(b))#define rep(i,a,n) for(int i=a;i=a;i--)///[n,a]#define pb push_back#define fi first#define se second#define IO ios::sync_with_stdio(false)#define fre freopen("in.txt","r",stdin)#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef long long ll;typedef unsigned long long ull;const double PI=acos(-1.0);const double E=2.718281828459045;const double eps=1e-3;const int INF=0x3f3f3f3f;const int MOD=1e8+7;const int N=1e3+5;const ll maxn=1e6+5;const int dir[4][2]= {-1,0,1,0,0,-1,0,1};int n,s,a,b;int ans;void dfs(int sum,int cur,int cnt){ if(cnt==n) { if(sum==s) ans=(ans+1)%MOD; return ; } dfs(sum+cur+a,cur+a,cnt+1); dfs(sum+cur-b,cur-b,cnt+1);}int main(){ while(~scanf("%d%d%d%d",&n,&s,&a,&b)) { ans=0; for(int i=s-n*a;i<=s+n*b;i++) { dfs(i,i,1); } printf("%d\n",ans); } return 0;}

正解。。 dp, 但是也不能全过,可以得90分,最后一组数据T了,即使开挂也过不了

详解

TLE【01背包】90分代码:

#include using namespace std;#define mem(a,n) memset(a,n,sizeof(a))#define memc(a,b) memcpy(a,b,sizeof(b))#define rep(i,a,n) for(int i=a;i=a;i--)///[n,a]#define pb push_back#define fi first#define se second#define IO ios::sync_with_stdio(false)#define fre freopen("in.txt","r",stdin)#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef long long ll;typedef unsigned long long ull;const double PI=acos(-1.0);const double E=2.718281828459045;const double eps=1e-3;const int INF=0x3f3f3f3f;const int MOD=1e8+7;const int N=1e3+5;const ll maxn=1e6+5;const int dir[4][2]= {-1,0,1,0,0,-1,0,1};ll n,s,a,b,f;ll dp[2][N*N];inline int Scan(){ int r = 0,f = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { r = r * 10 + ch - '0'; ch = getchar(); } return r * f;}inline void Print(int x){ if(x<0) { x=-x; putchar('-'); } if(x>9) Print(x/10); putchar(x%10+'0');}void fun(){ f=0; dp[f][0]=1; for(ll i=1; i

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:华硕ROG Delta棱镜白色款推出,支持Aura Sync神光同步
下一篇:【Codeforces Round #469 (Div. 2)】C. Zebras(贪心,思维)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~