| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
大牛帮忙看看: TLE了,DP的话怎么保存中间状态呀?感觉坐标在变所以不能单纯的保存在数组里面,但用DFS超时!!#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
struct cow{
int pnum; //喜欢地点的个数
int loc[50][2]; //这里是牛所喜欢的地点
} cows[102];
int cowxy[102][2]; //记录个牛所喜欢的坐标
int cownum;
double caldis(double x,double y,double xx,double yy){
return sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy));
}
double calcowdis(int x,int y){ //第x和第y只牛
return caldis(cowxy[x][0],cowxy[x][1],cowxy[y][0],cowxy[y][1]);
}
double cal(int k){
if(k==cownum)return 0;
if(k==cownum-1){
int pnum=cows[k].pnum;
double sum=10000.0;
for(int i=0;i<pnum;i++){
cowxy[k][0]=cows[k].loc[i][0];
cowxy[k][1]=cows[k].loc[i][1];
double dis1=calcowdis(k,0);
double dis2=calcowdis(k,k-1);
if(dis1+dis2<sum){
sum=dis1+dis2;
}
}
return sum;
}else if(k==0){
int prefern=cows[0].pnum;
double min=10000.0;
for(int i=0;i<prefern;i++){
cowxy[0][0]=cows[0].loc[i][0];
cowxy[0][1]=cows[0].loc[i][1];
double tmp=cal(1);
if(tmp<min){
min=tmp;
}
}
return min;
}else{
int prefern=cows[k].pnum;
double min=10000.0;
for(int i=0;i<prefern;i++){
cowxy[k][0]=cows[k].loc[i][0];
cowxy[k][1]=cows[k].loc[i][1];
double lastdis=calcowdis(k,k-1);
// return lastdis;
double other=cal(k+1);
if(lastdis+other<min){
min=lastdis+other;
}
}
return min;
}
}
void main(){
// ifstream cin("data.txt");
cin>>cownum;
for(int i=0;i<cownum;i++){
cin>>cows[i].pnum;
//cout<<cows[i].pnum<<" ";
for(int j=0;j<cows[i].pnum;j++){
int x,y;
cin>>x>>y;
cows[i].loc[j][0]=x+100;cows[i].loc[j][1]=y+100;
// cout<<cows[i].loc[j][0]<<" "<<cows[i].loc[j][1]<<" ";
}
// cout<<endl;
for(j=0;j<cownum;j++){
cowxy[j][0]=cowxy[j][1]=-1;
}
}
double tmp=cal(0);
cout<<int(tmp*100)<<endl;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator