题意:n匹狼,每匹狼有原始伤害和增加左右同伴的伤害,求杀死所有狼的最小伤害;
思路:区间dp,枚举长度,dp[i][j]表示杀死[i,j]区间所有狼的最小伤害;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define inf 0x3f3f3f3f int dp[505][505]; int a[505],b[505]; int n,m,t; int main(){ int i,j,k,cas,len; scanf("%d",&t); for(cas=1;cas<=t;cas++){ scanf("%d",&n); //memset(dp,inf,sizeof(dp)); for(i=1;i<=n;i++){ for(j=i;j<=n;j++){ dp[i][j]=inf; } } memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(i=1;i<=n;i++){ scanf("%d",&a[i]); } for(i=1;i<=n;i++){ scanf("%d",&b[i]); } for(len=0;len<=n;len++){ for(i=1;i<n-len+1;i++){ j=i+len; for(k=i;k<=j;k++){ dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j]+a[k]+b[i-1]+b[j+1]); } } } printf("Case #%d: ",cas); printf("%d\n",dp[1][n]); } return 0; }
原文:http://www.cnblogs.com/dominatingdashuzhilin/p/4855506.html