二维数组之最大联通和(联通涂色问题) beta!

不完美版本一

#include<iostream>
using namespace std;

/*int yiwei_max(int n,int a[],int *p,int *q)
{
     int temp=0,sum=-999999999,timer=-1;
     for(int i=0;i<n;i++)
     {
         if(temp>0)
         {
             temp+=a[i];
         }
         else
         {
             temp=a[i];
         }
         if(temp>sum)
         {
             sum=temp;
             *q=i;
             timer++;
         }
     }
     *p=*q-timer;
     return sum;
}*/

int max_sum(int n,int a[],int *besti,int *bestj)
{
     int *b = (int *)malloc(n * sizeof(int));
     int sum = 0;
     int i = -1;
     int temp = 0;

     for (i=0;i<=n-1;i++)
     {
          if (temp > 0)
          {
              temp += a[i];
          }
          else
          {
              temp = a[i];
          }
          b[i] = temp;
     }
     sum = b[0];
     for (i=1;i<=n-1;i++)
     {
         if (sum < b[i])
         {
             sum = b[i];
             *bestj = i;
         }
     }
    for (i = *bestj;i >= 0;i--)
    {
        if (b[i] == a[i])
        {
             *besti = i;
             break;
        }
    }
    free(b);
    return sum;
}

void main()
{
    int a[100][100],b[100];
    int up[100],down[100],t[100];
    int i,j,m,n,x,y;
    int temp,t2;
    int l=0,u=0,l_down,l_up,n_down,n_up;
    int s;

    cout<<"几行几列?"<<endl;
    cin>>m>>n;
    for(i=0;i<m;i++)
    {
         for(j=0;j<n;j++)
         {
              cin>>a[i][j];
         }
    }

    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            b[j]=a[i][j];
        }
        //temp=yiwei_max(n,b,&x,&y);
        temp=max_sum(n,b,&x,&y);
        up[i]=x;
        down[i]=y;
        t[i]=temp;
    }

    t2=t[0];
    for(i=0;i+1<m;i++)
    {
        if(up[i]<=down[i+1] && down[i]>=up[i+1])
        {
            t2+=t[i+1];
        }
        else
        {
            l_down=down[i];
            l_up=up[i];
            n_up=up[i+1];
            n_down=down[i+1];

            if(down[i]<up[i+1])
            {
                for(;l_down!=up[i+1];)
                {
                    l+=a[i][++l_down];
                }

                for(;n_up!=down[i];)
                {
                    u+=a[i+1][--n_up];
                }
            }
            if(up[i]>down[i+1])
            {
                for(;l_up!=down[i+1];)
                {
                    l+=a[i][--l_up];
                }

                for(;n_down!=up[i];)
                {
                    u+=a[i+1][++n_down];
                }
            }

            s=l>u?l:u;

            if(s+t[i+1]>0)
            {
                t2+=t[i+1]+s;
            }
        }
    }
    cout<<t2<<endl;
}
时间: 2024-11-11 20:24:18

二维数组之最大联通和(联通涂色问题) beta!的相关文章

二维数组的最大联通子数组和

设计题目:求一个二维数组的连通的数组中和最大的最大值. 设计思路: 建立二维数组并遍历二维数组,将所有正整数分块,验证是否联通,如果不联通,判断路径. package demo;import java.util.*;public class Lmax { static Scanner scanner = new Scanner(System.in); public static void main(String args[]){ int m,n; int b; Scanner scanner =

返回一个二维数组最大联通子数组的和

一.题目 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 二.设计思想 方法一:首先若要对二维数组进行分析,之前我们已经做过关于一位数组的练习,所以我们可以把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的结果就是最大联通子数组的和

返回一个二维数组中最大联通子数组的和

1 #include <iostream> 2 #include <time.h> 3 #include<string> 4 #include<fstream> 5 #define M 3 6 #define N 4 7 using namespace std; 8 9 int main() 10 { 11 int length[100],num[M][N] = {0},visit[M][N]={0},i=0;//length[100],是把文件中的数组转化

返回二维数组最大联通子数组的和

一.题目 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 二.设计思想 第一种方法:首先若要对二维数组进行分析,通常想要把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的就是最大联通子数组的和. 第二种方法:在二维整形数组中,数据可

二维数组最大联通子数组和

1.设计思想:先用户键盘输入一个自定义的几行几列的矩阵,然后输入相关的值,再调用求二维数组最大联通子数组和的方法,最终输出最大值. 2.出现问题:对于求联通子数组的这个思路不是很懂,不清楚. 3.解决方案:先求每行的最大和最小块,再求总的最大值,再将其输出:当列数为1时,当成一维计算: 4.源代码: /*返回一个整数数组中最大子数组的和. 输入一个一维整形数组,数组里有正数也有负数. 一维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.

二维数组的最大联通数组

设计思路:把数按行分成几个一维数组,对于该一维数组,求出他们的最大连续数组之和,并且记录下最大连续数组的第一位和最后一位的位置,之后判断几个一维数组的最大连续数组的位置是否相接或包括,最后在加上没有包括的正数,输出之前之和就行. 1 #include<iostream> 2 using namespace std; 3 4 int zuida(int n, int a[], int *sm, int *mm) 5 { 6 int b[100] = { 0 };//初始化 7 int i, su

二维数组最大连通和的求解

求一个二维数组的连通的数组中和最大的最大值. 代码 #include<iostream> #include<string> using namespace std; void MaxIntArray(int a[],int &max,int &begin,int &end,int n); //先将二维数组按行分成n个一维数组,求出每个一维数组最大子数组和,并记录最大子数组和的首末位置,在通过首末位置判断是否联通 void main() { int n,m;/

二维数组环求最大子数组

返回一个二维整数数组中最大联通子数组的和 2015年6月22日 1.题目 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 2.设计思路 参照环状一维数组,将二维数组进行扩展.只将数组的列数扩大为原来的2*n-1,行数不变. 3.源代码 #include <iostream> #include<time.h> using namespace std

二维数组最大子数组(结对开发)

1.题目要求 题目:返回一个二维整数数组中最大联通子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 2.设计思想: 对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块

14-高效求最长公共子序列(二维数组存不下)

/*                                   See LCS again时间限制:1000 ms  |  内存限制:65535 KB难度:3 描述 There are A, B two sequences, the number of elements in the sequence is n.m; Each element in the sequence are different and less than 100000. Calculate the length