1. 程式人生 > >Mobile Service -- 待補

Mobile Service -- 待補

link

試題分析

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
using namespace std;
inline int read(){
    int f=1,ans=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while
(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();} return f*ans; } const int N=1001; const int L=201; int dp[N][L][L],val[L][L],n,l,p[N],minn=INT_MAX; bool judge(int x1,int x2,int x3){ return (x1!=x2)&&(x2!=x3)&&(x1!=x3); } int _min(int a,int b){ return a>b?b:a;}
int main(){ l=read();n=read(); for(int i=1;i<=l;i++) for(int j=1;j<=l;j++) val[i][j]=read(); memset(dp,127/3,sizeof(dp));dp[0][1][2]=0,dp[0][2][1]=0;p[0]=3; for(int t=1;t<=n;t++){ p[t]=read(); for(int i=1;i<=l;i++){ for(int j=1;j<=l;j++){
/*val[i][p]*/ if(judge(p[t],p[t-1],j)){ dp[t][p[t-1]][j]=_min(dp[t][p[t-1]][j],dp[t-1][i][j]+val[i][p[t]]); dp[t][j][p[t-1]]=_min(dp[t][p[t-1]][j],dp[t][j][p[t-1]]); } /*val[j][p]*/ if(judge(p[t-1],i,p[t])){ dp[t][p[t-1]][i]=_min(dp[t][p[t-1]][i],dp[t-1][i][j]+val[j][p[t]]); dp[t][i][p[t-1]]=_min(dp[t][p[t-1]][i],dp[t][i][p[t-1]]); } /*val[p[t-1]][p]*/ if(judge(i,j,p[t])){ dp[t][i][j]=_min(dp[t][i][j],dp[t-1][i][j]+val[p[t-1]][p[t]]); dp[t][j][i]=_min(dp[t][j][i],dp[t][i][j]); } } } } for(int i=1;i<=l;i++) for(int j=1;j<=l;j++) { if(!(i!=j&&i!=p[n]&&j!=p[n])) continue; minn=min(minn,dp[n][i][j]); } printf("%d",minn); }
View Code