poj 3638
一个地图软件需要需要存储h个房子的坐标信息,但为节约存储空间可以只存储其中的m个房子的坐标信息
其他房子的坐标信息可以由插值得到。问怎样选择这个m个房子,使得所有房子的插值误差之和最小, 输出最小的插值误差均值。
n^3 dp
代码:
#include<iostream>
#include<fstream>
using namespace std;
int n,m;
double dp[201][201];
double a[201];
double w[201][201];
double fabs(double s){
if(s<0) return -s;
else return s;
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
int cas;
cin>>cas;
while(cas--)
{
memset(w,0,sizeof(w));
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{
for(k=i;k<=j;k++)
w[i][j]+=fabs(a[i]+(a[j]-a[i])*(k-i)/(j-i)-a[k]);
}
memset(dp,0,sizeof(dp));
dp[1][1]=0;
for(i=2;i<=n;i++)
dp[1][i]=1000000000;
for(i=2;i<=m;i++)
for(j=i;j<=n;j++)
{
dp[i][j]=100000000;
for(k=i-1;k<j;k++)
dp[i][j]=min(dp[i][j],dp[i-1][k]+w[k][j]);
}
printf("%.4lf\n",dp[m][n]/n);
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号