最长连续子序列和

连续 子序列 相当于子数组

动态规划

一维

dp[i]表示以i结尾的子数组的最大和
以下代码可以记录子数组的开始和结束位置

//要求输出子序列和的第一个和最后一个
#include<iostream>
#include<cstring>

//两个辅助数组
const int maxn=1000;
int dp[maxn];
int pre[maxn];//存放子序列的开始
int arr[maxn];
using namespace std;
int maxsubarray(int arr[],int n,int &flag){
    memset(dp,0,sizeof(dp));
    memset(pre, 0, sizeof(pre));
    pre[0]=0;//0的开始为0
    dp[0]=arr[0];
    int res=dp[0];
    for(int i=1;i<n;i++){
        if(arr[i]>dp[i-1]+arr[i]){
            dp[i]=arr[i];
            pre[i]=i;
        }else{
            dp[i]=dp[i-1]+arr[i];
            pre[i]=pre[i-1];
        }
        if(dp[i]>res){
            flag=i;
            res=dp[i];
        }
    }
    return res;
}
int main(){
    int N;
    while(cin >> N){
        if(N==0){
            break;
        }
        for(int i=0;i<N;i++){
            cin>>arr[i];
        }
        int flag=0;
        cout<<maxsubarray(arr,N,flag)<<" ";
        cout<<arr[pre[flag]]<<" "<<arr[flag]<<endl;
        /*
        for (int i = 0; i < N;i++){
            cout << dp[i] << " ";
            cout << pre[i] << " ";
        }*/
    }
    return 0;
}

二维 最大子矩阵

要学会降维!
在这里插入图片描述
一开始没想到,参考了别人的代码

#include <iostream>
#include <cstring>
using namespace std;

int maxsub(int a[],int n)	
{
	int i,max=0,b=0;
	for(i=0;i<n;i++)
	{
		if(b > 0)
			b += a[i];
		else 
			b = a[i];
		if(b > max)
			max = b;
	}
	return max;
}

int main()
{
	int n,i,j,k,maxsubrec,maxsubarr;
	int dp[101][101],arr[101];
	while(cin>>n)
	{
		 for(i=0;i<n;i++)
			 for(j=0;j<n;j++)
				 cin>>dp[i][j];
		 maxsubrec = 0;
		 for(i=0;i<n;i++)
		 {
			 memset(arr,0,sizeof(arr));
			 for(j=i;j<n;j++)
			 {
				 for(k=0;k<n;k++)
					 arr[k] += dp[j][k];
				 maxsubarr = maxsub(arr,n);
				 if(maxsubarr > maxsubrec) maxsubrec = maxsubarr;
			 }
		 }
		 cout<<maxsubrec<<endl;
	}
}
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读