Description
S得到了一个数,他认为相邻位上的数字与数字之间会产生不良影响,比如123,1和2之间产生一个不良影响值,2和3之间产生一个不良影响值。现在他想调整这个数每位的数字的顺序,使得最终得到的数的总的不良影响值最小,且没有前导0。
Input
输入数据的第一行为T表示有T组数据。每组数据先输入一个整数n(0<n<1000000000),接下来输入10*10的矩阵,Aij表示数字i与数字j相邻产生的不良影响值,0<Aij<1000000,矩阵是对称的,Aij与Aji相等。
Output
对于每组数据输出一行一个数,表示最小的不良影响值。
Sample Input
1 123 0 0 0 0 0 0 0 0 0 0 0 0 10 1 0 0 0 0 0 0 0 10 0 2 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Sample Output
3
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> using namespace std; #define FOR(i,a,b) for(int i=a;i<=b;i++) #define MST(a,b) memset(a,b,sizeof(a)) #define MAXN 12 int X,n,a[MAXN]; int g[MAXN][MAXN]; int ans; int b[MAXN]; void dfs(int k,int pre,int sum) { if(sum>=ans)return; if(k==n+1) { if(sum<ans)ans=sum; return ; } FOR(i,1,n)if(!b[i]) { if(a[i]==0 && k==1)continue; b[i]=1; int t=sum; if(k>1)t=t+g[pre][a[i]]; dfs(k+1,a[i],t); b[i]=0; } } int main() { freopen("in.txt","r",stdin); int nn; scanf("%d",&nn); FOR(ii,1,nn) { scanf("%d",&X); FOR(i,0,9)FOR(j,0,9)scanf("%d",&g[i][j]); ans=1000000*10; n=0; while(X) { a[++n]=X%10; X=X/10; } MST(b,0); dfs(1,0,0); printf("%d\n",ans); } }