【区间DP】CodeVS 1048 石子归并 [n方做法]

版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/82051951

前言&链接&大意

https://blog.csdn.net/xuxiayang/article/details/82051782


思路

原来的方程中的 w e i g h t ( i , j ) 是前缀和,这玩意满足

w e i g h t ( i , j + 1 ) + w e i g h t ( i + 1 , j ) w e i g h t ( i , j ) + w e i g h t ( i + 1 , j + 1 )

所以其满足四边形不等式

于是,我们只需要在最优的 p [ l , r 1 ] k p [ l + 1 , r ] 之间转移即可,时间复杂度 O ( n 2 )


代码

#include<cstdio>
#include<cstring>
using namespace std;int x,s[101],n,f[101][101],p[101][101];
signed main()
{
    memset(f,127/3,sizeof(f));
    scanf("%d",&n);
    for(register int i=1;i<=n;i++) scanf("%d",&x),s[i]=s[~-i]+x,f[i][i]=0,p[i][i]=i;
    for(register int i=n-1;i>0;i--)
     for(register int j=i+1;j<=n;j++)
      for(register int k=p[i][j-1];k<=p[i+1][j];k++)
       if(f[i][k]+f[k+1][j]+s[j]-s[~-i]<f[i][j])
    {
        f[i][j]=f[i][k]+f[k+1][j]+s[j]-s[~-i];//动态转移
        p[i][j]=k;//保存
    }
    printf("%d",f[1][n]);
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/82051951