OI基础系列之最大子数组问题

                           OI基础系列之最大子数组问题  

                                                         ——Edward2414
    oi退役了,虽然没取得多少成绩,也算是走过一会的人了。我相信绝大多数oi党都是自学成才,在此,我感谢那些把自己所学写到博客里的前辈们,没有你们,我不可能学到那么多的知识。所以,从今天起,我也会将自己的一些所学所得写下来,给后面的人做个参考,讲的都是很基础的东西,大神请直接无视。笔者水平有限,有疏漏之处,还望指出。

 

    今天说的叫最大子数组问题,大意是一个长度为n的数组中,求一个子数组,使这个子数组是所有子数组中元素和最大的那个。

 

一、最最朴素的算法      时间复杂度:O(n^3)      空间复杂度:O(n)

直接枚举每个字数组的首尾,并求和后与max比较即可。

PASCAL版:

//没安PASCAL编译器,所以细节上可能有些问题,大家凑合看。

program ed;

var

  i,j,k,n,max,sum:longint;

  a:array[0..1001] of longint;

begin

  readln(n);

  for i:=1 to n do read(a[i]);

  max:=-maxlongint;

  for i:=1 to n do

    for j:=i to n do

    begin

      sum:=0;

      for k:=i to j do

        inc(sum,a[k]);

      if sum>max then max:=sum;

    end;

  writeln(max);

end.

C++版:

#include<iostream>

using namespace std;

int main()

{

        long n,a[1001];

        cin>>n;

        for(long i=0;i!=n;i++)cin>>a[i];

        long max=-0x3fffffff,sum;

        for(long i=0;i!=n;i++)

            for(long j=i;j!=n;j++)

            {

                sum=0;a

                for(long k=i;k<=j;k++)

                    sum+=a[k];

                if(sum>max)max=sum;        

            }

        cout<<max<<endl;

       return 0;

}

 

二、朴素的算法      时间复杂度:O(n^2)      空间复杂度:O(n)

在算法一的基础上,考虑到每个子数组的和是可以预先求出来的。即预先求出sum[i]表示a[1] 到a[i]所有数的和,这样a[i]到a[j]的和就可以表示为sum[j]-sum[i-1],这样就可以省去第三重循环,把算法的时间复杂度降到O(n^2)。

PASCAL版:

     program ed;

var

     i,j,n,max:longint;

     a,sum:array[0..1001] of longint;

begin

     readln(n);                                  

     for i:=1 to n do read(a[i]);            

     sum[0]=0;                                

     for i:=1 to n do                           

       sum[i]:=sum[i-1]+a[i];             

     max:=-maxlongint;                    

     for i:=1 to n do                  

       for j:=i to n do                

         If sum[j]-sum[i-1]>max then

           max:=sum[j]-sum[i-1];

     writeln(max);

end.

 

C++版:

#include<iostream>

using namespace std;

int main()

{

    long n,a[1001];

    cin>>n;

    a[0]=0;

    for(long i=1;i<=n;i++)

    {

        cin>>a[i];

        a[i]+=a[i-1];

    }

    long max=-0x3fffffff;

    for(long i=1;i<=n;i++)

        for(long j=i;j<=n;j++)

            if(a[j]-a[i-1]>max)

                max=a[j]-a[i-1];

    cout<<max<<endl;

    return 0;

}

 

三、分治法        时间复杂度:O(nlgn)       空间复杂度:O(n)

这个方法是从《算法导论》上看到的方法,虽然算法不是最优的,但是整个算法的思路还是很有启发性的。这里引用《算法导论》的原话(略有删改):

我们来思考如何用分治法技术来求解最大子数组问题。假定我们要寻求子数组A[low..high]的最大子数组。使用分治技术以为这我们要将子数组划分为两个规模尽量相等的子数组。也就是说,寻找子数组的中央位置,比如mid,然后考虑求解两个子数组A[low..mid]和A[mid+1..high]。A[low..high]的任何连续子数组A[i..j]所处的位置必然是一下三种情况之一:

  1. 完全位于子数组A[low..mid]中,因此low<=i<=j<=mid。
  2. 完全位于子数组A[mid+1..high]中,因此mid<i<=j<=high。
  3. 跨越了中点,因此low<=i<=mid<j<=high。

     因此,A[low..high]的一个最大子数组所处的位置必然是这三种情况之一。实际上,A[low..high]的一个最大子数组必然是完全位于A[low..mid]中、完全位于A[mid+1..high]中或者跨越中点的所有子书中和最大者。我们可以递归地求解A[low..mid]和A[mid+1..high]的最大子数组,因此这两个子问题仍是最大子数组问题,只是规模更小。因此,剩下的全部工作就是寻找跨越中点的最大子数组,然后在三种情况下选取和最大者。

     我们可以很容易地在线性时间(相对于子数组A[low..high]的规模)内求出跨越中点的最大子数组。此问题并非原问题规模更小的实例,因此它加入了限制——求出的子数组必须跨越中点。任何跨越中点的子数组都有两个子数组A[i..mid]和A[mid+1..j]组成,其中low<=i<=mid且mid<j<=high。因此,我们只需找出形如A[i..mid]和A[mid+1..j]的最大子数组,然后将其合并即可。

     而因为A[i..mid]和A[mid+1..j]相互独立,我们可以很容易的在O(n)时间内分开求出他们的最大子数组。

 

PASCAL版:

//再次声明,笔者没有PASCAL的编译器,所有程序都是对着C++手码的,仅仅方便//pascaler的理解,不保证正确。

program ed;

var

  a:array[0..100001] of longint;

  i,n:longint;

 

function max(a,b:longint):longint;

begin

  if a>b then exit(a);

  exit(b);

end;

 

function find_max_crossing_subarray(low,mid,high):longint;

var

  left_sum,right_sum,sum,i:longint;

begin

  left_sum:=-maxlongint;

  sum:=0;

  for i:=mid downto low do

  begin

    inc(sum,a[i]);

    left_sum:=max(left_sum,sum);

  end;

  right_sum:=-maxlongint;

  sum:=0;

  for i:=mid+1 to high do

  begin

    inc(sum,a[i]);

    right_sum:=max(right_sum,sum);

  end;

  exit(left_sum+right_sum);

end;

 

function find_maximum_subarray(low,high):longint;

var

  mid,maxn:longint;

begin

  if high=low then exit(a[low]);

  mid:=(low+high) div 2;   //类似的,这样写 mid:=(low+high)>>1; 也行。

  maxn:=find_max_crossing_subarray(low,mid,high);

  maxn:=max(maxn,find_maximum_subarray(low,mid));

  maxn:=max(maxn,find_maximum_subarray(mid+1,high));

  exit(maxn);

end;

 

begin

  readln(n);

  for i:=1 to n do read(a[i]);

  writeln(find_maximum_subarray(1,n));

end.

 

C++版:

#include<iostream>

#define min_num -0x3fffffff

using namespace std;

 

long a[100001];

 

long max(long a,long b){return (a>b)?a:b;}

 

long  find_max_crossing_subarray(long low,long mid,long high)

{

    long left_sum=min_num,sum=0;

    for(long i=mid;i>=low;i--)

    {

        sum+=a[i];

        left_sum=max(left_sum,sum);

    }

    long right_sum=min_num; sum=0;

    for(long i=mid+1;i<=high;i++)

    {

        sum+=a[i];

        right_sum=max(right_sum,sum);

    }

    return left_sum+right_sum;

}

 

long find_maximum_subarray(long low,long high)

{

     if(low==high)return a[low];

     long mid=(low+high)/2;

     long maxn=find_max_crossing_subarray(low,mid,high);

     maxn=max(maxn,find_maximum_subarray(low,mid));

     maxn=max(maxn,find_maximum_subarray(mid+1,high));

     return maxn;

}

 

int main()

{

    long n; cin>>n;

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

    cout<<find_maximum_subarray(1,n)<<endl;

    return 0;   

}

 

四、动态规划法(DP)    时间复杂度:O(n)     空间复杂度:O(n)

设f[i]表示a[1..i]的最大子数组。设想我们已经求出f[i],如何扩展到f[i+1]?仔细思考后会发现,在已知f[i]的前提下,f[i+1]不外乎就两种情况:一种是f[i+1]不包含a[i+1],那么显然f[i+1]=f[i]。另一种是f[i+1]包含a[i+1],那么f[i+1]显然是a[j..i+1](1<=j<=i+1)中最大的那个,不妨设max{a[j..i+1]}(1<=j<=i+1)为g[i+1],那么显然g[i+1]就是表示以a[i+1]结尾的最大子数组。

假设我们已经求出了g[i+1],那么依据上面所述,便可得f[i+1]的状态转移方程:

f[i+1]=max{f[i],g[i+1]}

现在问题已经成功转化为求g[i+1]。还是按照同样的思路去想,假设我们已经求出g[i],如何扩展到g[i+1]?同样也就两种情况:一种是g[i]为负数,那么显然g[i+1]=a[i+1];另外一种g[i]不是负数,那么g[i+1]=g[i]+a[i+1]。所以,g[i+1]的为状态转移方程:

                   g[i+1]=max{g[i]+a[i+1],a[i+1]}

综上所述我们便得到了整个问题的状态转移方程:

f[i+1]=max{f[i],g[i+1]}

                   g[i+1]=max{g[i]+a[i+1],a[i+1]}

多说一句,如果你对这种含有多个数组DP很感兴趣,推荐做一下RQNOJ上的又上锁妖塔一题,也是这个类型的。还有一道USACO的一道奶牛跑步的题目用的也是这个方法,具体哪一题记不清了,有兴趣可以去找一下。

 

PASCAL版:

program ed;

var

  a,f,g:array[0..100001] of longint;

  i,n:longint;

 

fucntion max(a,b:longint):longint;

begin

  if a>b then exit(a);

  exit(b);

end;

 

begin

  readln(n);

  for i:=1 to n do read(a[i]);

  f[0]:=-maxlongint; g[0]:=-maxlongint;

  for i:=1 to n do

  begin

    g[i]:=max(g[i-1],0)+a[i];

    f[i]:=max(f[i-1],g[i]);

  end;

  writeln(f[n]);

end.

 

C++版:

#include<iostream>

#define maxn 100001

#define min_num -0x3fffffff

using namespace std;

 

long max(long a,long b){return (a>b)?a:b;}

 

int main()

{

    long n,a[maxn],f[maxn],g[maxn]; cin>>n;

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

    f[0]=min_num; g[0]=min_num;

    for(long i=1;i<=n;i++)

    {

        g[i]=max(g[i-1],0)+a[i];

        f[i]=max(f[i-1],g[i]);        

    }

    cout<<f[n]<<endl;

    return 0;

}

 

五、动态规划法(空间优化版)         时间复杂度O(n)     空间复杂度O(1)

好吧,我承认这种方法就是闲的蛋疼,没太大实质性优化,拿出来给大家参考一下。

回顾下上面方法的状态转移方程:

                   f[i+1]=max{f[i],g[i+1]}

                   g[i+1]=max{g[i]+a[i+1],a[i+1]}

你会发现无论是f[i]还是g[i]都只与前一项有关,想到了什么,滚动数组!(不知道的自行百度,很多大神的文章讲的都很详细)自然而然就有了这种方法(用了位运算的知识,不会的同样百度,推荐Matrix67神牛讲解位运算的文章)。表达式如下:

PASCAL:

          f[(i+1) and 1]=max{f[i and 1],g[(i+1) and 1]}

          g[(i+1) and 1]=max(g[i and 1]+a[(i+1) and 1],a[(i+1) and 1]

C++:

          f[(i+1)&1]=max{f[i&1],g[(i+1)&1]}

          g[(i+1)&1]=max(g[i&1]+a[(i+1)&1],a[(i+1)&1]

 

PASCAL版:

program ed;

var

  i,n,a:longint;

  f,g:array[0..1] of longint;

 

function max(a,b:longint):longint;

begin

  if a>b then exit(a); exit(b);

end;

 

begin

  readln(n);

  f[0]:=-maxlongint; f[1]:=-maxlongint; g[0]:=-maxlongint; g[1]:=-maxlongint;

  for i:=1 to n do

  begin

    read(a);

    g[i and 1]:=max(g[(i-1) and 1],0)+a;

    f[i and 1]:=max(f[(i-1) and 1],g[i and 1];

  end;

  writeln(f[n and 1]);

end.

 

C++版:

#include<iostream>

#include<cstdlib>

#define min_num -0x3fffffff

using namespace std;

int main()

{

    long n,a,f[2]={min_num,min_num},g[2]={min_num,min_num}; cin>>n;

    for(long i=1;i<=n;i++)

    {

        cin>>a;

        g[i&1]=max(g[(i-1)&1]+a,a);

        f[i&1]=max(f[(i-1)&1],g[i&1]);

    }

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

    return 0;

}

 

六、动态规划法2                 时间复杂度O(n)     空间复杂度O(1)

换一个思路想想,其实f[i]数组是不必要的。因为最大子数组一定是以某一个a[i]结尾的,所以答案就是g[i]的最大值。

 

PASCAL版:

program ed;

var

  i,n,a,ans:longint;

  g:array[0..1] of longint;

 

function max(a,b:longint):longint;

begin

  if a>b then exit(a); exit(b);

end;

 

begin

  readln(n);

  g[0]:=-maxlongint; g[1]:=-maxlongint; ans:=-maxlongint;

  for i:=1 to n do

  begin

    read(a);

    g[i and 1]:=max(g[(i-1) and 1],0)+a;

    ans:=max(ans,g[i and 1]);

  end;

  writeln(ans);

end.

 

C++版:

#include<iostream>

#include<cstdlib>

#define min_num -0x3fffffff

using namespace std;

int main()

{

    long n,a,ans=min_num,g[2]={min_num,min_num}; cin>>n;

    for(long i=1;i<=n;i++)

    {

        cin>>a;

        g[i&1]=max(g[(i-1)&1]+a,a);

        ans=max(ans,g[i&1]);

    }

    cout<<ans<<endl;

    return 0;

}

 

七、一种新的思路——转化问题                时间复杂度O(n)   空间复杂度O(n)

放在这里并不是说这种方法比上面的要好,只是思路比较新颖。

设b[i]表示a[1..i]的和,那么问题转化为求i,j(i<=j),使b[j]-b[i]的差最大。记f[i]表示b[i..n]的最大值。那么答案显然是f[i]-b[i]的最大值。

f[i]可以在线性时间内求出来,状态转移方程如下:

                     f[i]=max{f[i+1],b[i]}

有了f[i],答案就显而易见了。

PASCAL版:

program ed;

var

  a,f:array[0..100001] of longint;

  i,n,ans:longint;

 

function max(a,b:longint):longint;

begin

  if a>b then exit(a); exit(b);

end;

 

begin

  readln(n);

  for i:=1 to n do

  begin

    read(a[i]);

    inc(a[i],a[i-1]);

  end;

  ans:=-maxlongint; f[n+1]:=-maxlongint;

  for i:=n downto 0 do

  begin

    f[i]:=max(f[i+1],a[i]);

    ans:=max(ans,f[i]-a[i]);

  end;

  writeln(ans);

end.

 

C++版:

#include<iostream>

#include<cstdlib>

#define min_num -0x3fffffff

using namespace std;

int main()

{

    long n,a[

    long ans=min_num; f[n+1]=min_num;

    for(long i=n;i>=0;i--)

    {

        f[i]=max(f[i+1],a[i]);

        ans=max(ans,f[i]-a[i]);        

    }

    cout<<ans<<endl;

    return 0;

}

 

八、最大子数组问题的扩展——最大子矩阵    时间复杂度:O(n^3)    空间复杂度:O(n^2)

现在我们将最大子数组问题扩展到2维,变成最大子矩阵问题。即在一个二维数组中找一个最大子矩阵。这里用到的方法就是把最大子矩阵问题转化为最大子数组问题解决。说的具体点就是枚举矩阵行的上下界,设二维数组为a[m][n],假设枚举上下界为i,j(i<=j),那么b[k]=a[t][k](i<=t<=j)的和。这样就可以用最大子数组的方法。枚举的时间复杂度为O(n^2),和可以用与算法二类似的方法预处理,最后最大子数组时间复杂度为O(n),所以最大子矩阵问题的时间复杂度:O(n^3)。

经典的问题如AHOI2011的第一题,以及RQNOJ上的某题。当然这个问题还能扩展到三维、四维乃至更高维,基本上对于M维的问题,用类似的方法可以写出一个时间复杂度O(n^(2M-1)),空间复杂度O(n^M)的算法。比较经典的例子就是RQNOJ上的切西瓜这题。

下面给出二维情况的代码:

PASCAL版:

program ed;

var

  a:array[0..101,0..101] of longint;

  f:array[0..101] of longint;

  i,j,k,m,n,ans:longint;

 

function max(a,b:longint):longint;

begin

  if a>b then exit(a); exit(b);

end;

 

begin

  readln(m,n);

  for i:=1 to m do

  begin

    for j:=1 to n do

    begin

      read(a[i,j]);

      inc(a[i,j],a[i-1,j]);

    end;

    readln;

  end;

  ans:=-maxlongint;

  for i:=1 to m do

    for j:=i to m do

    begin

      f[0]:=-maxlongint;

      for k:=1 to n do

      begin

        f[k]:=max(f[k-1],0)+a[j,k]-a[i-1,k];

        ans:=max(ans,f[k]);

      end;

    end;

  writeln(ans);

end.

 

C++版:

#include<iostream>

#include<cstdlib>

#define min_num -0x3fffffff

using namespace std;

int main()

{

    long m,n,a[101][101],f[101]; cin>>m>>n;

    for(long i=1;i<=n;i++)a[0][i]=0;

    for(long i=1;i<=m;i++)

        for(long j=1;j<=n;j++)

        {

            cin>>a[i][j];

            a[i][j]+=a[i-1][j];

        }

    long ans=min_num;

    for(long i=1;i<=m;i++)

        for(long j=i;j<=m;j++)

        {

            f[0]=min_num;

            for(long k=1;k<=n;k++)

            {

                f[k]=max(f[k-1]+a[j][k]-a[i-1][k],a[j][k]-a[i-1][k]);

                ans=max(ans,f[k]);

            }

        }

    cout<<ans<<endl;

    return 0;

}

 

至此,最大子数组问题就就告一段落了。作者本人水平有限,如果读者发现内容中的错误或是有什么建议,希望予以指出。

本文由Edward2414创作,转载请注明出处。

转载于:https://www.cnblogs.com/edward2414/archive/2013/03/27/oi-01.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面向对象组合继承

function Person(name,sex,age){ this.name name; this.sex sex; this.age age;}Person.prototype.eat function(){ console.log("每个人都会吃饭");}function Programmer(name,sex,age){ this.habby "看书"; Person.call(this,name,sex,…

企业微信报错https:// open.work.weixin.qq.com/devtool/query?e=60020

企业微信报错&#xff1a; not allow to access from your ip, hint: [1667358733640290333963300], from ip: 180.164.177.83, more info at https:// open.work.weixin.qq.com/devtool/query?e60020 企业微信对60020处理&#xff1a;我是没太搞懂这个 企业微信报错60020解决…

std::string删除首字符

查了下std::string的使用手册&#xff0c;才知道string删除字符只有erase成员方法&#xff0c;但是这个方法提供了3个重载函数&#xff0c;如下&#xff1a; string& erase ( size_t pos 0, size_t n npos ); iterator erase ( iterator position ); iterator erase ( it…

Mybatis各种模糊查询及#和$区别

模糊查询&#xff1a; 工作中用到&#xff0c;写三种用法吧 sql中字符串拼接SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT(%, #{text}), %); 使用 ${...} 代替 #{...}SELECT * FROM tableName WHERE name LIKE %${text}%; 程序中拼接 Java // or String searchText …

Tomcat 配置支持APR

对ARP支持&#xff0c;需要安装以下库&#xff1a; APR libraryJNI wrappers for APR used by Tomcat (libtcnative)OpenSSL libraries其中JNI wrappers(libtcnative)安装依赖另外两项&#xff0c;以及Java headers.&#xff08;It depends on APR, OpenSSL, and the Java head…

[算法] 麻将序数牌组合方案

// 环境: centos7.2, g v4.8.5#include <iostream> #include <unistd.h> #include <stdio.h> #include <string.h> #include <vector> #include <map>using namespace std;enum CombineType {CombineType_Null 0, // 单牌CombineType_Dui…

swagger接口数据上传

后端接口参数格式&#xff1a; 1.正常大对象传参&#xff1a; 2.正常参数传参&#xff1a; 3.第三者传参&#xff1a;

java中单例模式的3种实现

1 饿汉式单例类.在类初始化时&#xff0c;已经自行实例化 class EagerSingleton { private static final EagerSingleton m_instance new EagerSingleton(); /** * 私有的默认构造子 */ private EagerSingleton() { } /** * * 静…

webstrom打开多个项目,webstrom常用快捷键

1.webstrom打开多个项目默认情况下一次只能打开一个项目&#xff0c;如果需要打开多个就按照下面的方法File -> settings -> Directories -> Add Content Root 中添加你需要的工程目录。2.加速 禁用多余的插件&#xff0c;关掉没必要的代码检查项。 webstorm慢的原因主…

[算法] vector删除元素

#include <iostream> #include <algorithm>using namespace std;bool IsOdd (int i) { return i % 2 1; } // 奇数void test_remove(vector<int>& v) {auto del remove(v.begin(), v.end(), 9); // 删除所有的9v.erase(del, v.end());//v.erase(del);…

XMLHttpRequest 跨域请求获取 Response Header

XMLHttpRequest 跨域请求获取 Response Header xhr.getAllResponseHeaders() // 获取所有的headerxhr.getResponseHeader("key") // 获取指定的header

ASP.NET MVC3数据绑定到VIEW的方式

ASP.NET MVC3数据绑定到VIEW的方式 1、 指定页面数据的强类型Module 数据类型是强类型&#xff0c;编译时报错&#xff0c;运行效率高 Action: public ActionResult Index() { var _instructors new List<Instructor>( new Instructor[] { new Instructor { Name &…

值得一做》关于并查集的进化题目 BZOJ1015(BZOJ第一页计划)(normal-)

这道题和以前做过的一道经典的洪水冲桥问题很像&#xff0c;主要做法是逆向思维。&#xff08;BZOJ第10道非SB题纪念&#xff09; 先给出题目 Description 很久以前&#xff0c;在一个遥远的星系&#xff0c;一个黑暗的帝国靠着它的超级武器统治者整个星系。某一天&#xff0c;…

git操作之pull拉取远程指定分支以及push推送到远程指定分支

一、pull操作 1、将远程指定分支 拉取到 本地指定分支上&#xff1a; &#xff08;注&#xff1a;命令里的尖括号<>只是包裹中文的标识&#xff0c;方便你看的&#xff0c;实际使用时不用写&#xff0c;不过冒号需要&#xff09; git pull origin <远程分支名>:…

[算法] 求排列组合: 从n个数中任选m个数组成一个新数

#include <iostream> #include <vector>using namespace std;// 求排列组合算法: C(n, m): 从n个数中任选m个数组成一个新的数, 求有多少种组合, 分别是什么 // 从v[]里任选m个元素组成一个组合, 与顺序无关 template<class T> vector<vector<T>&g…

Functional ProgrammingLazy Code:被我忘记的迭代器

本文给出一个Functional Programming和Lazy Code的一个例子。跟着思路走&#xff0c;关键的地方会有相应的说明。 我们想实现一个判断"素数"的小程序&#xff0c;如下&#xff1a; using System;namespace FunctionalProgramming {class Program{static void Main(st…

TP框架如何绑定参数。目的进行ajax验证

TP框架的自动绑定 对于某些操作的情况&#xff08;例如模型的写入和更新方法&#xff09;&#xff0c;可以支持参数的自动绑定&#xff0c;例如&#xff1a; 首先需要开启DB_BIND_PARAM配置参数&#xff1a; DB_BIND_PARAM > true 然后&#xff0c;我们在使用 1.$Model M(U…

使用js 计算两个日期之间的相差的天数

将两个日期都转换为毫秒&#xff0c;然后相减&#xff0c;再将减下来的毫秒数转换为天数&#xff0c;就可以得到两个日期之间相差的天数了。&#xff08;接受的日期格式为“20201-1”&#xff0c;“20201/1”等用连接符连接起来的日期字符串&#xff09; getDiffDay(date_1, da…

PhpStorm配置Xdebug调试PHP程序

From: http://blog.csdn.net/ljfrocky/article/details/46531137这篇文章主要介绍了如何使用PhpStorm Xdebug调试PHP程序&#xff0c;需要的朋友可以参考下。运行环境PhpStorm版本&#xff1a;8.0.3 PHP版本&#xff1a;5.4.12 xdebug版本&#xff1a;php_xdebug-2.2.3-5.4-vc…

对刚

3 /*直接链表模拟 */ #include<cstdio> #include<iostream> #define M 100010 using namespace std; int next[M],fa[M],vis[M],n,t; int main() {//freopen("jh.in","r",stdin);//freopen("resist.in","r",stdin);//freo…