hdu 5115
题意:有一排狼,攻击某只狼狼会受到这只狼的伤害a[i],和周围狼的伤害b[i-1]+b[i+1],然后问你消灭这一排狼,最少受到多少伤害
思路:dp[i][j]表示消灭i-j这些狼所受最少伤害,dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j]+a[k]+b[i-1]+b[j+1])
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int inf=1e9+7; 4 5 int a[300],b[300]; 6 int dp[300][300]; 7 8 int main(){ 9 int t; 10 int tt=1; 11 scanf("%d",&t); 12 while(t--){ 13 int n; 14 scanf("%d",&n); 15 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 16 for(int i=1;i<=n;i++) scanf("%d",&b[i]); 17 b[0]=0;b[n+1]=0; 18 for(int i=1;i<=n;i++){ 19 for(int j=i;j<=n;j++){ 20 if(i==j) dp[i][i]=a[i]+b[i-1]+b[i+1]; 21 else dp[i][j]=inf; 22 } 23 } 24 for(int i=1;i<=n;i++){ 25 for(int l=1;l<=n;l++){ 26 int r=i+l; 27 if(r>n) break; 28 for(int k=l;k<=r;k++){ 29 dp[l][r]=min(dp[l][r],dp[l][k-1]+dp[k+1][r]+a[k]+b[l-1]+b[r+1]); 30 } 31 } 32 } 33 /* 34 for(int i=1;i<=n;i++){ 35 for(int j=i;j<=n;j++){ 36 cout<<i<<" "<<j<<" "<<dp[i][j]<<endl; 37 } 38 } 39 */ 40 printf("Case #%d: ",tt++); 41 cout<<dp[1][n]<<endl; 42 } 43 }