2021-09-08

4.9 相等的多项式

问题描述

小明现在在学习多项式的展开:就是把一个形如
(x+a1) (x+a2) … (x+an)
展开成如下形式:
xn + b1xn-1 + b2xn-2 + … + bn-1x + bn
比如 (x+1)(x+2)=x2 + 3x + 2
(x+1)3 = x3 +3x2 +3x + 1
小明做了很多练习,但是不知道对错,现在请求你的帮助,判断小明的展开式是否正确。

输入格式

有多组测试数据。
每组测试数据有三行,第一行是一个正整数N,表示多项式最高指数。N=0表示输入结束,并且不需要处理。
第二行N个整数ai,用空格隔开,i=1,…,N(-100≤ai≤100)
第三行N个整数bi,用空格隔开,i=1,…,N,(-109≤bi≤109)
40%的测试数据 1 ≤ N < 5;
30%的测试数据 5 ≤ N < 10;
20%的测试数据10 ≤ N < 15;
10%的测试数据 15 ≤N≤ 20;

输出格式

对于每组测试数据,输出一行一个字符‘Y’如果展开式是正确的,输出‘N’如果展开式错误。

样例输入

2
1 2
3 2
3
1 1 1
3 3 1
4
0 0 0 1
0 0 0 1
0

样例输出

Y
Y
N

思路

这个问题题目分类的算法要求是回溯法,我们经过分析也可以知道,如果将所有的系数作为一棵树,多项式的系数为二叉树的叶子结点,那么就构成了一棵完全、满二叉树,这也就是这个题目回溯法的解空间树;
同时由解空间树的出现我们也可以轻易求出,这个题目我们递归的时间复杂度为θ(2^n),根据我们声明的结果数组,此题空间复杂度为θ(n);

提醒

我在递归的时候,一开始结束条件用的是i=n-1;也就是当我们达到了最后一层的时候就立即退出,但是在我调试的时候,出现了一种问题,就是因为有最高幂次项,我在单独讨论的时候出现了直接的return,因此,最后一层出现了最高幂次项旁边的那一项会被直接return掉,因此,我把结束条件换成了i=n,建议可以顺着样例考虑一下这里,因为我就因为这个-1,花了一个半小时。

//9、相等的多项式
#include <iostream>
#include <cmath>
using namespace std;
void calculate(int *a,int *r,int n,int i,int num,int result); 
int main(){
	int n;
	while(cin >> n){
		if(n == 0)
			return 0;
		int *a,*b,*result;
		a = new int[n];
		b = new int[n];
		result = new int[n];
		for(int i=0;i<n;i++)
			cin >> a[i];
		for(int i=0;i<n;i++)
			cin >> b[i];
		for(int i=0;i<n;i++)
			result[i] = 0; //初始化
		calculate(a,result,n,0,0,1);
		//递归计算出除最高幂次项外的系数
		int i=0;
		for(i=0;i<n;i++)
			if(result[i]!=b[i])
				break;
		if(i == n)
			cout <<"Y"<<endl;
		else 
			cout <<"N"<<endl;
		delete[] a;
		delete[] b;
		delete[] result;
	}
}
void calculate(int *a,int *r,int n,int i,int num,int result){
	if(i==n&&num>0){//递归结束,将结果加到数组中
		r[num-1] += result;
	}
	else if(num==0&&i==n)//全部没有选择常数项,最高幂次系数为1,我们不看
		return;
	else{
	//递归选择
	//不选择此刻的常数项
		calculate(a,r,n,i+1,num,result);
	//选择这一常数项
		calculate(a,r,n,i+1,num+1,result*a[i]);
	}
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未雨谋筹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值