其他分享
首页 > 其他分享> > Dire Wolf HDU - 5115

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