蓝桥杯第五届javaA组 波动数列
一、题目
二、分析
最开始没有思路,参考了一下下网上的方法,用动态规划+滚动数组来做,类似于01背包问题
(参考网址:https://blog.****.net/wr132/article/details/43861145)
三、代码
不知道为什么,只能得到70分,后面的3组测试数据都超时了。。。。
import java.util.Scanner;
public class Main {
static int n,s,a,b;
static int[][] ans;
static int mod = 100000007;
static int count;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n=in.nextInt();
s=in.nextInt();
a=in.nextInt();
b=in.nextInt();
int num=(n*(n-1))/2; //a,b总数
ans = dp(num);
for(int j=0;j<=num;j++) //共有j个a
{
if((s-a*j+b*(num-j))%n==0)
{
if((n-1)%2==0)
count=(count+ans[0][j])%mod;
else
count=(count+ans[1][j])%mod;
}
}
System.out.print(count);
}
private static int[][] dp(int numa)
{
int[][] f = new int[2][numa+1];
f[0][0]=1;
for(int i=1;i<=n-1;i++)
{
for(int j=0;j<=(i*(i+1))/2;j++)
{
if(i>j)
f[i%2][j]=f[(i-1)%2][j];
else
{
f[i%2][j]=(f[(i-1)%2][j]+f[(i-1)%2][j-i])%mod;
}
}
}
return f;
}
}