1 条题解

  • 0
    @ 2025-10-8 16:56:34
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    
    const int N=500+5;
    
    ll a[N],f[N][N],pre[N];
    int n;
    
    signed main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++) scanf("%lld",a+i),pre[i]=pre[i-1]+a[i];
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++) f[i][j]=1ll<<60;
    		f[i][i]=0;
    	}
    	for(int i=n;i>=1;i--){//注意 i 是倒序,因为在算 f[1][n] 前要先算完 f[2...n][n]
    		for(int j=i+1;j<=n;j++){
    			for(int k=i;k<j;k++){
    				f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+pre[j]-pre[i-1]);
    			}
    		}
    	}
    	printf("%lld",f[1][n]);
    }
    
    • 1

    *【动态规划:区间中间推】石子合并

    信息

    ID
    1369
    时间
    1000ms
    内存
    64MiB
    难度
    4
    标签
    递交数
    123
    已通过
    56
    上传者