RONOJ——PID204 / 特种部队 ☆

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(){;}

 

以上是关于RONOJ——PID204 / 特种部队 ☆的主要内容,如果未能解决你的问题,请参考以下文章

在部队敲代码是一种什么样的体验?

在部队敲代码是一种什么样的体验?

在部队敲代码是一种什么样的体验?

Android 逆向Android 系统文件分析 ( /proc/pid 进程号对应进程目录 | oom_adj | maps | smaps | mem | task | environ )(代码片

Android 逆向Android 系统文件分析 ( /proc/pid 进程号对应进程目录 | oom_adj | maps | smaps | mem | task | environ )(代码片

nginx: [error] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)(代码片