GCJ1C09C Bribe the Prisoners
区间dp
#include <bits/stdc++.h>
using namespace std;
const int maxN=100+10;
int A[maxN],dp[maxN][maxN];
int T,P,Q;
int main() {
scanf("%d",&T);
for(int t=1;t<=T;t++) {
scanf("%d%d",&P,&Q);
for(int i=1;i<=Q;i++) {
scanf("%d",&A[i]);
}
A[0]=0,A[Q+1]=P+1;
for(int i=0;i<=Q+1;i++) {
for(int j=0;j<=Q+1;j++) dp[i][j]=INT_MAX;
}
for(int i=0;i<=Q;i++) dp[i][i+1]=0;
for(int w=2;w<=Q+1;w++) {
for(int i=0;i+w<=Q+1;i++) {
int j=i+w,tmp=INT_MAX;
for(int k=i+1;k<j;k++) {
tmp=min(tmp,dp[i][k]+dp[k][j]);
}
dp[i][j]=tmp+A[j]-A[i]-2;
}
}
printf("Case #%d: %d\n",t,dp[0][Q+1]);
}
return 0;
}