// POSIX C #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <signal.h> #include <errno.h> #include <fcntl.h> #include <dirent.h> // ANSI C #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> // C++ lib #include <iostream> #include <limits> #include <fstream> #include <vector> using namespace std; int main(){     int N;     cin>>N;     if(N == 0){         cout<<0<<endl;         return 0;     }     vector<int> A(N);     vector<int> B(N);     for(int i=0;i<N;++i){         cin>>A[i];     }     for(int i=0;i<N;++i){         cin>>B[i];     }     vector<vector<int> > d(N+1, vector<int>(N+1, 0));     d[0][0] = 0;     for(int i=1;i<=N;++i){         if(i%2 == 0){             int sum = 0;             for(int j=0;j<i;j+=2){                 sum += A[j]*A[j+1];             }             d[i][0] = sum;         }else{             d[i][0] = numeric_limits<int>::max();         }     }     for(int i=1;i<=N;++i){         if(i%2 == 0){             int sum = 0;             for(int j=0;j<i;j+=2){                 sum += B[j]*B[j+1];             }             d[0][i] = sum;         }else{             d[0][i] = numeric_limits<int>::max();         }     }     d[1][1] = A[0]*B[0];     for(int i=2;i<=N;++i){         if(i%2 == 1){             int min = numeric_limits<int>::max();             if(d[i-1][0]!=numeric_limits<int>::max()){                 min = min<(d[i-1][0]+A[i-1]*B[0])?min:(d[i-1][0]+A[i-1]*B[0]);             }             if(d[i-2][1]!=numeric_limits<int>::max()){                 min = min<(d[i-2][1]+A[i-1]*A[i-2])?min:(d[i-2][1]+A[i-1]*A[i-2]);             }             d[i][1] = min;         }else{             d[i][1] = numeric_limits<int>::max();         }     }     for(int i=2;i<=N;++i){         if(i%2 == 1){             int min = numeric_limits<int>::max();             if(d[0][i-1]!=numeric_limits<int>::max()){                 min = min<(d[0][i-1]+A[0]*B[i-1])?min:(d[0][i-1]+A[0]*B[i-1]);             }             if(d[1][i-2]!=numeric_limits<int>::max()){                 min = min<(d[1][i-2]+B[i-1]*B[i-2])?min:(d[1][i-2]+B[i-1]*B[i-2]);             }             d[1][i] = min;         }else{             d[1][i] = numeric_limits<int>::max();         }     }     for(int i=2;i<=N;++i){         for(int j=2;j<=N;++j){             int min = numeric_limits<int>::max();             if(d[i-1][j-1]!=numeric_limits<int>::max()){                 min = d[i-1][j-1]+A[i-1]*B[j-1];             }             if(d[i-2][j]!=numeric_limits<int>::max()){                 min = min<(d[i-2][j]+A[i-2]*A[i-1])?min:(d[i-2][j]+A[i-2]*A[i-1]);             }             if(d[i][j-2]!=numeric_limits<int>::max()){                 min = min<(d[i][j-2]+B[j-2]*B[j-1])?min:(d[i][j-2]+B[j-2]*B[j-1]);             }             d[i][j] = min;         }     }     /*     for(int i=0;i<=N;++i){         for(int j=0;j<=N;++j){             cout<<d[i][j]<<" ";         }         cout<<endl;     }     */     cout<<d[N][N]<<endl;     return 0; } // 你提交试试,个人感觉好难,想了整晚。。。
点赞 6

相关推荐

牛客网
牛客网在线编程
牛客网题解
牛客企业服务