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;
}

posted on 2011-05-06 15:41  宇宙吾心  阅读(291)  评论(0)    收藏  举报

导航