Dire Wolf HDU - 5115
作者:互联网
思路:
和这道Multiplication Puzzle 很像,但初始化不一样.f[i][j]表示杀死[i,j]区间的最小值,枚举的间断点k是最后杀死的狼k.那么状态转移方程很好想,主要是初始化的问题,当len=1时,f[i][j] = a[i]还是a[i]+b[i-1]+b[i+1],由len=2递推可以发现后者是答案.
个人认为初始化的不同是根据f数组的定义来的,这里是杀死[i,j]区间,ans受i-1与j+1的影响.而POJ那道题定义的是以[i,j]为端点的最小值.
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 typedef long long LL; 6 const int N = 210; 7 int n,a[N],b[N],f[N][N],kcase; 8 int main() 9 { 10 // freopen("in.txt","r",stdin); 11 int T; 12 scanf("%d",&T); 13 while(T--) 14 { 15 scanf("%d",&n); 16 for(int i=1;i<=n;i++) scanf("%d",&a[i]);//攻击 17 for(int i=1;i<=n;i++) scanf("%d",&b[i]);//加成 18 for(int i=1;i<=n;i++) f[i][i] = a[i]+b[i-1]+b[i+1]; 19 for(int len=2;len<=n;len++) 20 for(int l=1;l+len-1<=n;l++) 21 { 22 int r = l+len-1; 23 f[l][r] = 0x3f3f3f3f; 24 for(int k=l;k<=r;k++) 25 f[l][r] = min(f[l][k-1]+a[k]+f[k+1][r]+b[l-1]+b[r+1],f[l][r]); 26 } 27 printf("Case #%d: %d\n",++kcase,f[1][n]); 28 } 29 return 0; 30 }
标签:5115,初始化,HDU,int,scanf,long,Wolf,len,include 来源: https://www.cnblogs.com/newblg/p/14553146.html