RONOJ——PID204 / 特种部队 ☆

题目描述

某特种部队接到一个任务,需要潜入一个仓库。该部队士兵分为两路,第一路士兵已经在正面

牵制住了敌人,第二路士兵正在悄悄地从后方秘密潜入敌人的仓库。

当他们到达仓库时候,发现这个仓库的锁是一把很诡异的电子锁,上面是一排按钮,每个按钮

上都有一个数字……10 秒钟后,总部返回了该锁的技术信息。要解开这把锁,首先要从左边的第

一个按钮开始向右按动,中间可以跳过某些按钮,按动到最右边的按钮后,反向向左按动。最终,

每个按钮都要按且仅按一次。每两个相邻按钮上数字之差的总和的最小值,便是解开这把锁的密码。

作为一支装备精良的特种部队,必须要在最短的时间内完成任务,解开这把锁,潜入仓库。

输入格式

第一行是一个n(2 <= n <= 1000)表示共有n 个按钮。

第二行是n 个正整数,代表从左至右各按钮上的数字,数值均不超过2000。

输出格式

只有一个数,为这把锁的密码。

 

f[i][j]表示向右按到i,向左按到j的最优解

设k=max(i,j)+1,则 点k 可以更新到i,到j的最优解

 1 #include <cstdlib>
 2 #include <cstring>
 3 #include <cstdio>
 4 
 5 #define max(a,b) (a>b?a:b)
 6 #define min(a,b) (a<b?a:b)
 7 const int N(1005);
 8 int n,num[N],dis[N][N],f[N][N];
 9 
10 int Presist()
11 {
12     scanf("%d",&n);
13     for(int i=1; i<=n; ++i)
14         scanf("%d",num+i);
15     for(int i=1; i<=n; ++i)
16       for(int j=1; j<=n; ++j)
17         dis[i][j]=abs(num[i]-num[j]);
18     memset(f,127,sizeof(f)); f[0][0]=0;
19     for(int k,i=0; i<=n; ++i)
20         for(int j=0; j<=n; ++j)
21         {
22             k=max(i,j)+1;
23             f[i][k]=min(f[i][k],f[i][j]+dis[j][k]);
24             f[k][j]=min(f[k][j],f[i][j]+dis[k][i]);
25         }
26     int ans=0x3f3f3f3f;
27     for(int i=1; i<=n; ++i)
28     {
29         ans=min(ans,f[i][n]+dis[i][n]);
30         ans=min(ans,f[n][i]+dis[n][i]);
31     }
32     printf("%d\n",ans);
33     return 0;
34 }
35 
36 int Aptal=Presist();
37 int main(){;}

 

posted @ 2017-09-13 21:36  Aptal丶  阅读(407)  评论(1编辑  收藏  举报