zoukankan      html  css  js  c++  java
  • 最长连续和与最大子矩阵

    1. 最长连续和

    求一个串里面最长连续的子串

    如:

    1 2 3 -4 5 -10

    最长是 1 2 3 -4 5 和7 长度5 起始1~5

    算法:

    这应该是一个很简单的问题, 倒是本人想复杂了, 耗时不少呀~

    不说, 贴代码, 主要是sum的作用, 细细体会:

    for(i=0;i<N;i++)
        scanf("%d",&a[i]);
    
    int x = 1,y = 1;
    int flag = 1;
    int sum = 0;
    int ans = -INF;
    for(int i = 1;i <= N;i ++)
    {
    	sum += a[i];
    	if(sum > ans)
    	{
    		ans = sum;
    		x = flag;
    		y = i;
    	}
    	if(sum < 0)//这里 不能是else 要考虑所有数为负数
    	{
    		sum = 0;flag = i+1;
    	}
    }

    2. 最大子矩阵

    和上面类似, 只是换成了二维

    矩阵压缩, 把第I到第N行压缩到一行上

    int temp[MAX],map[MAX][MAX];
    int getsum()
    {
    	int sum = 0,max = -INF;
    	for(int i = 1;i <= M; i ++)
    	{
    		sum += temp[i];
    		if(sum > max) max = sum;
    		if(sum < 0) sum = 0;
    	}
    	return max;
    }
    int main()
    {
    	for(int i = 1;i <= N; i ++)
    		for(int j = 1;j <= M; j ++)
    			scanf("%d",&map[i][j]);
    
    	int ans = -INF;
    	for(int i = 1; i <= N; i ++)//从第i行开始
    	{
    		memset(temp,0,sizeof(temp));
    		for(int j = i; j <= N; j ++)//从i行到N行都尝试叠加上去
    		{
    			for(int k = 1; k <= M; k ++)//把i到j行的每一列加起来。。。就是矩阵压缩
    				temp[k] += map[j][k];
    
    			int pre = getsum();//计算压缩的一维连续区间最大和
    			if(ans < pre)
    				ans = pre;
    		}
    	}
    	return 0;
    }

    hdu1003 hdu1081


    每天早上叫醒你的不是闹钟,而是心中的梦~
  • 相关阅读:
    Git 在Idea下的操作
    负载均衡算法-java实现
    MySQL 上亿大表优化实践 转
    盘点 10 个代码重构的小技巧
    wireshark抓包工具详细说明及操作使用
    限流
    Semaphore
    CyclicBarrier
    CountDownLatch和枚举配合使用
    ReentrantReadWriteLock读写锁
  • 原文地址:https://www.cnblogs.com/vintion/p/4116957.html
Copyright © 2011-2022 走看看