1 #include<cstdio> 2 #include<climits>//INT_MAX 3 #include<algorithm> 4 using namespace std; 5 6 const int Max_M = 100; 7 8 //輸入 9 int T,N,M; 10 int A[Max_M+2]; //A下標: 0 - M+1 保存要吃掉羊的位置 11 12 int dp[Max_M+1][Max_M+2];//i:0-M j:0-M+1 dp數組 13 14 void solve() 15 { 16 A[0] = 0; //由於dp[i][j]不包含兩端,因此爲統一求解 17 A[M+1] = N+1;//最後答案即 dp[0][N+1] 因此額外加上這兩個位置 18 19 //初始化dp數組 20 for(int m=0; m<=M; m++){ 21 dp[m][m+1] = 0; 22 } 23 24 //從短區間開始填充dp數組 w:區間長度 25 for(int w=2; w<=M+1; w++) 26 { 27 for(int i=0; i+w<=M+1; i++ )// j <= M+1 28 { 29 int j = i + w; 30 int t = INT_MAX; 31 for(int k=i+1; k<j; k++){ 32 t = min( t, dp[i][k]+dp[k][j]); 33 } 34 dp[i][j] = t + A[j] - A[i] - 2; 35 } 36 } 37 printf("%d\n",dp[0][M+1]); 38 } 39 40 int main() 41 { 42 scanf("%d",&T); 43 while( T-- ) 44 { 45 scanf("%d%d",&N,&M); 46 for(int i=1; i<=M; i++){ 47 scanf("%d",&A[i]); 48 } 49 50 solve(); 51 } 52 53 return 0; 54 }