首页 > 其他分享 >合并石子

合并石子

时间:2022-09-25 20:25:07浏览次数:48  
标签:10000 int 石子 合并 环形 2n include 1000

这个就强调一点:一定要分清是线性排列还是环形排列,如果是环形的话,只需要将n+1--2n重新赋一遍值,

但是:!!!s[i]要继续s[i]=s[i-1]+a[i],而且别忘了给f[n+1][n+1]---f[2n][2n]赋一遍0

我也在这个上错了好几次!

线性实现:

#include<iostream>
#include<cstring>
int f[1000][1000],s[10000];
int k,n;
using  namespace std;
int main()
{
    cin>>n;
    memset(f,0x3f,sizeof(f));
    for(int i=1;i<=n;i++)
    {
        cin>>k;
        s[i]=s[i-1]+k;
        f[i][i]=0;
    }
    
    
    for(int len=2;len<=n;len++)
    {
        for(int l=1;len+l-1<=n;l++)
        {
            int r=l+len-1;
            for(int k=l;k<r;k++)
                f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]);
        }
    }
    cout<<f[1][n];
    return 0;
}

环形实现:

#include<iostream>
#include<cstring>
int f[1000][1000],s[10000],a[10000];
int k,n,maxn,miny=100000000;
using  namespace std;
int main()
{
    cin>>n;
    memset(f,0x3f,sizeof(f));
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        s[i]=s[i-1]+a[i];
        f[i][i]=0;        

    }
    for(int i=n+1;i<2*n;i++)
    {
        a[i]=a[i-n];
        s[i]=s[i-1]+a[i];
        f[i][i]=0;        
    }
//    len+l-1=j
    //j-l=len-1
    for(int len=2;len<=n;len++)
    {
        for(int l=1;len+l-1<=2*n;l++)
        {
            int r=l+len-1;
            for(int k=l;k<r;k++)
                f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]);
        }
    }
    miny=f[1][n];
    for(int i=2;i<=n;i++)
    {    
        miny=min(miny,f[i][i+n-1]);
    }
//    cout<<f[1][n]<<endl;
    cout<<miny<<endl;
    memset(f,0,sizeof(f));
    for(int len=2;len<=2*n;len++)
    {
        for(int l=1;len+l-1<=2*n;l++)
        {
            int r=l+len-1;
            for(int k=l;k<r;k++)
                f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]);
        }
    }
//    cout<<f[1][n];
    for(int i=1;i<=n;i++)
    {
        maxn=max(maxn,f[i][i+n-1]);
    }
    cout<<maxn;
    return 0;
    } 

我这个程序揉合了两部分,我相信优秀的audience(读者)一定可以看得明白

(yes

标签:10000,int,石子,合并,环形,2n,include,1000
From: https://www.cnblogs.com/xdzxsuming/p/16728687.html

相关文章

  • 实际工作中 GIT 如何创建合并推送分支
    实际工作中GIT的分支合并是如何操作的?根据这个视频记录的笔记【实际工作中GIT如何创建合并推送分支】https://www.bilibili.com/video/BV1eD4y1F7Kt?share_source=cop......
  • 力扣23(java)-合并k个升序链表(困难)
    题目:给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例1:输入:lists=[[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4......
  • 环形合并石子
    #include<iostream>#include<cstring>intf[1000][1000],s[10000],a[10000];intk,n,maxn,miny=100000000;usingnamespacestd;intmain(){cin>>n;mems......
  • 合并两个顺序表
    合并两个顺序表已知有两个顺序表LA和LB(代码如下所示),并且两个表的储存的两个相邻元素,后者要大于或等于前者。合并这两个表。LA,LB的初始化#include<stdio.h>#defineMaxS......
  • 88. 合并两个有序数组
    题目给你两个按非递减顺序排列的整数数组 nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同......
  • m3u8文件后缀jpg,png等处理方法及视频合并
    处理#解析伪装成png的tsdefresolve_ts(src_path,dst_path):'''如果m3u8返回的ts文件地址为https://p1.eckwai.com/ufile/adsocial/7ead0935-dd4f-4d2......
  • 前端合并单元格
     <!--合并单元格场景:将水平或垂直多个单元格合并成一个单元格1.明确合并哪几个单元格2.通过左上原则,确定保留谁删除谁上下合并-只保留最上的,删除其他左右合并-只......
  • Excel合并多个Excel工作簿
    Excel(powerquery)汇总多个Excel工作簿材料背景:多个Excel文件的表名(即字段)需要相同,如不相同,则会部分数据缺失需要被汇总的Excel文件放在同一个文件夹中,不需要放其他......
  • 力扣21(java&python)-合并两个有序链表(简单)
    题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。  示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1......
  • ES6合并数组并去重
    constdeps={'采购部':[1,2,3],'人事部':[5,8,12],'行政部':[5,14,79],'运输部':[3,64,105]}letmember=Object.values(deps).flat(Infin......