栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

石子合并——GarsiaWachs算法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

石子合并——GarsiaWachs算法

前言:

        除了O(N^2)的动态规划做法外,还有 O( nlogn) 的非动态规划做法。

                                                                                                                       ——《算法进阶指南》

这就是今天的主角:GarsiaWachs算法。

算法介绍:

        GarsiaWachs,一个专为石子合并而生的算法。

        它的大致流程如下:

        设一个序列是A[0..n-1],每次寻找最小的一个满足A[k-1]<=A[k+1]的k,

        那么我们就把A[k]与A[k-1]合并,之后找最大的一个满足A[j]>A[k]+A[k-1]的j,把合并后的值A[k]+A[k-1]插入A[j]的后面。

        有定理保证,如此操作后问题的答案不会改变,且时间复杂度为 nlogn。

定理证明详见《The Art of Computer Programming》第3卷6.2.2节。

所以呢???

上代码!!!

#include
#define pb push_back
#define int long long//十年 oi 一场空 , 不开 long long 见祖宗! 
using namespace std;

int n,ans;
vector a;//要  vector 或 快读快些  教程的,我觉得有必要给我打零花钱。 

//快读快写不解释 
template
inline void read(type &x){x=0;bool flag(0);char ch=getchar();while(!isdigit(ch)) flag=ch=='-',ch=getchar();while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();flag?x=-x:0;}
template
inline void write(type x,int flag){x<0?x=-x,putchar('-'):0;static short Stack[50],top(0);do Stack[++top]=x%10,x/=10; while(x);while(top) putchar(Stack[top--]|48);if(flag==0);else if(flag==1){putchar(' ');}else {puts("");}}

int check(void);

//养成好习惯 ,从这里阅读! 
signed main()
{
    read(n);
    
    for(int i=1;i<=n;++i)
    {
    	int x;
    	read(x);
        a.pb(x);
    }
	
    for(int i=0;ires)
        {
        	//找A[j]>A[k]+A[k-1]的j,把合并后的值A[k]+A[k-1]插入A[j]的后面。 
            _k=i;
            break; 
        }
    }
    
    //插入 。 
    a.insert(a.begin()+_k+1,res);
    
    //返回代价 。 
    return res;
}

撒花完结!!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/951856.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号