HDU 4283 You Are the One(区间DP)

HDUOJ 4283

学习区间DP,积累经验ing

这次大框架挺熟悉了,代码打得也快了

但是还是在断点k上出了问题:

 

pos(k,i,i+li-1)
                {
                    f[i][i+li-1]=min(f[i][i+li-1],(a[i]*(k-i)+f[i+1][k]+f[k+1][i+li-1]+(k-i+1)*(b[i+li-1]-b[k])));
                }

最后这个

f[k+1][i+li-1];

这里会导致出现 前>后

因此初始化要记得

f[j][j-1]=0;

 

错误点就是这个,还是在断点上没考虑清楚

 

 

 

下面是题面和ac码

 

#include<bits/stdc++.h>
#define ll long long 
#define pos(i, a, b) for (int i = (a); i <= (b); i++)
#define neg(i, a, b) for (int i = (a); i >= (b); i--)
const int Max=150;
const int inf=0x7f7f7f;
using namespace std;

int n,t;
int a[Max],b[Max];
int f[Max][Max];

int main()
{
    freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    cin>>t;
    pos(e,1,t)
    {
        //memset(a,0,sizeof(a));
        //memset(b,0,sizeof(b));
        cin>>n;
        pos(u,1,n)
        {
            pos(y,1,n) f[u][y]=inf;
        }
        pos(j,1,n) 
        {
            cin>>a[j];
            b[j]=b[j-1]+a[j];
            f[j-1][j]=a[j];
            f[j][j-1]=0;
            f[j][j]=0;
        }
        pos(li,2,n)
        {
            pos(i,1,n-li+1)
            {
                pos(k,i,i+li-1)
                {
                    f[i][i+li-1]=min(f[i][i+li-1],(a[i]*(k-i)+f[i+1][k]+f[k+1][i+li-1]+(k-i+1)*(b[i+li-1]-b[k])));
                }
            }
        }
        printf("Case #%d: %d\n",e,f[1][n]);
    }
    
    return 0;
}

 

posted @ 2020-10-31 16:57  juuich  阅读(103)  评论(0编辑  收藏  举报