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(){;}

 

转载于:https://www.cnblogs.com/Shy-key/p/7517840.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值