磁盘调度
OJ题目:click here~~
学习学习咱们大牛的博文去吧,点~~~
AC_CODE
const int maxn = 1008 ;
int y[maxn] ;
int dist[maxn][maxn] ;
int dp[maxn][maxn] ;
int n ;
int getDist(int a , int b){
int t = (y[a] >= y[b]) ? (y[a] - y[b]) : (y[b] - y[a]) ;
return min(t , 360 - t) ;
}
int DP(){
int i , j , k ;
for(i = 1;i <= n;i++)
for(j = 1;j <= i;j++)
dist[i][j] = dist[j][i] = getDist(i , j) ;
dp[2][1] = dist[2][1] ;
for(i = 2;i < n;i++){
for(j = 1;j < i;j++){
dp[i + 1][i] = min(dp[i + 1][i] , dp[i][j] + dist[j][i + 1]) ;
dp[i + 1][j] = min(dp[i + 1][j] , dp[i][j] + dist[i][i + 1]) ;
}
}
int ans = 1 << 30 ;
for(i = 1;i < n;i++)
ans = min(ans , dp[n][i] + dist[i][n]) ;
return ans ;
}
int main(){
int i , t , T ;
//freopen("in.txt" , "r" , stdin) ;
cin >> t ;
while(t--){
memset(dp , 63 , sizeof(dp)) ;
cin >> n ;
n++ ;
y[1] = 0 ;
for(i = 2;i <= n;i++){
scanf("%d%d",&T , &y[i]) ;
}
int ans ;
ans = 400 * 2 * T + (n - 1) * 10 ;
ans += DP() ;
cout << ans << endl ;
}
return 0 ;
}