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;
}
posted @ 2020-10-08 12:16  darkroome  阅读(58)  评论(0编辑  收藏  举报