题目描述
具体地说,就是在第二段音频中找到一个长度和第一段音频相等且是连续的子序列,使得它们的 difference 最小。两段等长音频的 difference 定义为:
difference = SUM(a[i] - b[i])2 (1 ≤ i ≤ n),其中SUM()表示求和
其中 n 表示序列长度,a[i], b[i]分别表示两段音频的音高。现在袋鼠先生想要知道,difference的最小值是多少?数据保证第一段音频的长度小于等于第二段音频的长度。
输入描述:
第一行一个整数n(1 ≤ n ≤ 1000),表示第一段音频的长度。 第二行n个整数表示第一段音频的音高(0 ≤ 音高 ≤ 1000)。 第三行一个整数m(1 ≤ n ≤ m ≤ 1000),表示第二段音频的长度。 第四行m个整数表示第二段音频的音高(0 ≤ 音高 ≤ 1000)。
输出描述:
输出difference的最小值
输入例子:
2 1 2 4 3 1 2 4
输出例子:
0
以下是我写的代码,在VS2017运行正常,提交之后说我没有通过所有案例,我尝试了很多输入,感觉一切正常啊,是不是我写代码的风格太不符合要求了?
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#define MAX 1000
int Calcu(int First[MAX], int For[MAX],int, int);//声明函数计算两个数组的SUM
int main()
{
int value[MAX];
int FirstLen=0, SecondLen=0;
int First[MAX], Second[MAX];
scanf("%d", &FirstLen);
for (int i = 0; i < FirstLen; i++)
{
scanf("%d", &First[i]);
}
scanf("%d", &SecondLen);
for (int i = 0; i < SecondLen; i++)
{
scanf("%d", &Second[i]);
}
int For[MAX];//定义暂时存放数据的数组
for (int i = 0; i < SecondLen-FirstLen+1; i++)
{
int ii = 0;//每次循环都定义ii的值为0
for (int j = i; j < i+FirstLen; j++)//从第i个位置起,把后面的固定长度的值分别赋给新数组,再计算SUM
{
For[ii] = Second[j];
ii++;
}
value[i]=Calcu(First,For,FirstLen,0);//每调用一次,都把数据加入到数组
}
int min = 1000;//定义哨兵,给它一个比较大的值
for (int i = 0; i < SecondLen-FirstLen+1; i++)//在value数组中找最小值
{
if (min>value[i])
{
min = value[i];
}
}
printf("%d", min);//输出最小value
return 0;
}
int Calcu(int First[MAX], int For[MAX],int FirstLen,int Value)
{
for (int i = 0; i < FirstLen; i++)
{
Value += (First[i] - For[i])*(First[i] - For[i]);
}
return Value;
}