题目链接
区间DP
$dp_{i,j}$为杀掉$i~j$内的狼的最小代价
枚举$i~j$中最后杀掉的狼,$dp_{i,j}=min{ { {kin{[i,j]}} | dp_{i,k-1}+dp_{k+1,j}+A_k+B_{i-1}+B_{j+1}} }$
1 #include<cstdio> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #define re(i,l,r) for(int i=(l);i<=(r);i++) 6 #define rre(i,r,l) for(int i=(r);i>=(l);i--) 7 using namespace std; 8 typedef long long LL; 9 int t,A[222],B[222],n; 10 LL hh[222][222]; 11 LL dfs(int l,int r) 12 { 13 LL &ret=hh[l][r]; 14 if(ret)return ret; 15 ret=1LL<<60; 16 if(l>r)return ret=0;LL now=B[l-1]+B[r+1]; 17 re(i,l,r)ret=min(dfs(l,i-1)+dfs(i+1,r)+A[i]+now,ret); 18 return ret; 19 } 20 int main() 21 { 22 scanf("%d",&t);int tt=t; 23 while(t--) 24 { 25 printf("Case #%d: ",tt-t); 26 memset(hh,0,sizeof(hh)); 27 scanf("%d",&n); 28 re(i,1,n)scanf("%d",&A[i]); 29 re(i,1,n)scanf("%d",&B[i]); 30 printf("%lld ",dfs(1,n)); 31 } 32 return 0; 33 }