[Asalto previo al examen de la Copa Lanqiao] La 11ª Competencia Provincial de la Copa Lanqiao Simula la secuencia de swing C / C ++

  如果一个序列的奇数项都比前一项大,偶数项都比前一项小,则称为一个摆动序列。即 a[2i]<a[2i-1], a[2i+1]>a[2i]。
  小明想知道,长度为 m,每个数都是 1 到 n 之间的正整数的摆动序列一共有多少个。
输入格式
输入一行包含两个整数 m,n。
输出格式
输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。
样例输入
3 4
样例输出
14
样例说明
以下是符合要求的摆动序列:
  2 1 2
  2 1 3
  2 1 4
  3 1 2
  3 1 3
  3 1 4
  3 2 3
  3 2 4
  4 1 2
  4 1 3
  4 1 4
  4 2 3
  4 2 4
  4 3 4
评测用例规模与约定
对于 20% 的评测用例,1 <= n, m <= 5;
  对于 50% 的评测用例,1 <= n, m <= 10;
  对于 80% 的评测用例,1 <= n, m <= 100;
  对于所有评测用例,1 <= n, m <= 1000。
一看就不是我能做的题
小菜鸡飘过......
刚看到这题感觉一般方法肯定做不来
只能使用dp
可是我就是不会dp呀
那怎么办呀
一个字  想
刚开始
没有看清题意
用了next_permutation
当然只是为了过样例了
毕竟,有的东西很明显的
比如,全排列时间复杂度很高这种事
可是这都不成
不知道大家知道为什么不成吗
是因为他这里样例允许重复
而我的全排列不能出现重复
此时,灵光一闪
我可能能拿到20%样例的分了
不知道我接下来想到的
大家有没有想到过这个
既然是要允许重复
那我之前dfs学的还行啊
哈哈哈哈哈哈
博主联想到了自己之前做的那道题
【用1,2,4,8,16,32中的若干个数的和组成的小于等于50的正整数有多少个?】
大家也可以去看看
然后就是使用那里面的思路
写了写
样例真的过了
哈哈哈哈哈
开心啊
不过大家最好不要打印
毕竟打印很耗时的
算了
不提了
上代码
再重述一遍
我只是蹭了一点分而已
这个题的标准题解应该是dp算法吧
大家可以看【亓官劼】的博客
#include<iostream>
using namespace std;
int n,m;
int ans;
//int a[1005];
void dfs(int num,int last_value,int now_value){
    
    //num存放当前是第几个数,last_value存放上一个值,now_value存放当前值 
	if(num!=0){
    
    
	    if(num%2==0){
    
    
		    if(now_value>=last_value){
    
    
				return;
		    }
	    }else{
    
    
		    if(now_value<=last_value){
    
    
				return;
		    }
	    }
	} 
	if(num==m){
    
    
		ans++;
		ans=ans%10000; 
		/*for(int i=1;i<=m;i++){
			cout<<a[i]<<" ";
		}
		cout<<endl;*/
		return;
	}
	for(int i=1;i<=n;i++){
    
    
		//a[num+1]=i;
		dfs(num+1,now_value,i);
	}
}
int main(){
    
    
	cin>>m>>n;
	dfs(0,0,0);
	cout<<ans<<endl;
	return 0;
}

有问题可以留言交流٩(๑❛ᴗ❛๑)۶

Supongo que te gusta

Origin blog.csdn.net/kieson_uabc/article/details/109080897
Recomendado
Clasificación