标签:div 信息 res lib 电子 printf 最小 数值 for
题目描述
某特种部队接到一个任务,需要潜入一个仓库。该部队士兵分为两路,第一路士兵已经在正面
牵制住了敌人,第二路士兵正在悄悄地从后方秘密潜入敌人的仓库。
当他们到达仓库时候,发现这个仓库的锁是一把很诡异的电子锁,上面是一排按钮,每个按钮
上都有一个数字……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(){;}
标签:div 信息 res lib 电子 printf 最小 数值 for
原文地址:http://www.cnblogs.com/Shy-key/p/7517840.html