宰羊
阿新 • • 發佈:2020-09-19
#include<iostream> #include<cstring> using namespace std; const int N = 10010, M = 110, INF = 0x3f3f3f3f; int f[M][M]; int a[N]; int n, m; int main(){ int T; cin >> T; while(T --){ cin >> n >> m; for(int i = 1; i <= m; i ++) cin >> a[i]; a[m + 1] = n + 1; // memset(f, 0x3f, sizeof f); 這句話區間dp暫時別用吧,初始條件估計還有別的 for(int len = 1; len <= m; len ++) for(int l = 1; l + len - 1 <= m; l ++){ int r = l + len - 1; if(len == 1) f[l][r] = a[r + 1] - a[l - 1] - 2; else{ f[l][r] = INF; for(int k = l; k <= r; k ++) f[l][r] = min(f[l][r], f[l][k - 1] + f[k + 1][r] + a[r + 1] - a[l - 1] - 2); } } cout << f[1][m] << endl; } return 0; }