小张用某种仪器获得了一组观测值A,A长度为n,A中每一个数都是0-255之间的整数。但是观测值A存在一定的误差,现在小张想求得最可能的真实值B,使得:
- B中的每一个数都是0-255的整数且与A长度相同
- 0< = B(i+1) -B(i) <= 3( 0 <= i < n-1)
- A和B之间的L2损失最小(A(i)和B(i)差的平方的和最小)
要求返回最小的L2损失。
输入第一行是数据长度n(0<n<1000)
第二行是n个0-255之间的整数
返回一个整数表示L2损失
例子:
输入:
5
1 2 3 6 10
返回
1
c++实现
#include<vector>
#include<stdlib.h>
#include<stdio.h>
#include<iostream>
#include <math.h>
using namespace std;
int minLoss(int n, vector<int> A)
{
int sumLoss = 0;
vector<int> B(n, 0);//初始化B
B[0] = A[0];
for (int i = 1; i < A.size(); i++)
{
if (A[i] - B[i - 1] > 3)
{
B[i] = B[i-1] + 3;
sumLoss += pow(A[i] - B[i],2);
}
else if (A[i] - B[i - 1] < 0)
{
B[i] = B[i - 1];
sumLoss += pow(A[i] - B[i], 2);
}
else
{
B[i] = A[i];
}
}
return sumLoss;
}
int main()
{
int n;
cin >> n;//第一个输入是数据长度n
vector<int> A;
for (int i = 0; i < n; i++)
{
int temp;
scanf_s("%d", &temp);//依次输入观测值A
A.push_back(temp);
}
int res = minLoss(n, A);
printf("min L2 loss is : %d", res);
system("pause");
return 0;
}