21xrx.com
2024-12-22 22:23:13 Sunday
登录
文章检索 我的文章 写文章
C++石子合并代码
2023-07-05 14:07:19 深夜i     --     --
C++ 石子 合并 代码

C++石子合并代码是一种用于求解石子合并问题的编程语言代码。石子合并问题是求解将若干个石子堆合并成一堆石子所需要最小的代价问题。该问题常用于算法竞赛和编程练习中。

以下是一段示例 C++ 代码,用于求解石子合并问题:


#include<iostream>

#include<cstdio>

#include<algorithm>

using namespace std;

const int INF=1e9+7;

int n;

int a[30005];

int pre[30005],suf[30005];

int f[30005][30005];

int main(){

  cin>>n;

  for(int i=1;i<=n;i++) cin>>a[i];

  for(int i=1;i<=n;i++) pre[i]=pre[i-1]+a[i];

  for(int i=n;i>=1;i--) suf[i]=suf[i+1]+a[i];

  for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) f[i][j]=INF;

  for(int i=1;i<=n;i++) f[i][i]=0;

  for(int len=2;len<=n;len++)

    for(int i=1;i<=n-len+1;i++){

      int j=i+len-1;

      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]+suf[i]-suf[k]);

    }

  cout<<f[1][n]<<endl;

  return 0;

}

以上代码中,使用了前缀和和后缀和的思想,减少了计算次数,提高了算法的效率。在外层循环中,枚举区间长度,内层循环中,枚举区间起点。通过寻找中转点,计算出最小的合并代价,并记录在 f 数组中。最后输出 f 数组中的最小代价即可。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复