题目大意:有遮头狼排成一排,每只狼都对相邻的狼的攻击力有加成作用,每杀死一只狼所受到的伤害为当前狼的攻击力(算上加成的部分),被杀死之后的狼对相邻的狼的攻击力的加成会被取消,同时,原先与被杀死的狼相邻的两头狼会变成相邻的狼。要求使得受到的伤害值最小,求出最小值。
状态方程:
dp[i][j]=min(dp[i][j],dp[起始][k-1]+a[k]+dp[k+1][截止]+左右两遍加成 b[i-1]+ b[j+1] );
#include <iostream>
#include <stdio.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll dp[205][205];
ll a[205];
ll b[205];
int main()
{
int T;
cin>>T;
for(int Case=1;Case<=T;Case++)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
scanf("%lld",&b[i]);
for(int x=0;x<n;x++)
{
for(int i=1;i<=n-x;i++)
{
int j = i+x;
dp[i][j] = INF;
for(int 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: %d\n", Case, dp[1][n]);
}
return 0;
}