您的位置:首页 > 其它

最大子数组2.0

2016-03-26 21:58 162 查看
成环
//求最大子数组和 张鹏宇 武于微
/****************************************************************
题目要求:
用户输入整数组,首尾相接,寻找最大子数组,求出其和,并返回子数组位置
思路:
用户随机输入num个整数(num由用户确定),存入数组number[][]
用循环实现二维数组转化,目的是实现数组收尾相接,找出最大子数组
用两个循环实现寻找每一个整数作为初始值得最大子数组,并将结果存入CMax[]
最后输出CMax中的最大值,
每次扫描寻找子数组时,定义一个flag[]数组
对应用来存储该位置的整数是否在子数组中
最后扫描flag[],输出对应位置整数即可
不足:
输出子数组位置时:情况一:****ABC****(ABC是目标整数,*是无用数据)
         情况二:------+++++(-表示负数+表示正数)
这两种情况无法输出子数组,调试不知道哪里错了,子数组的和一切正常
*****************************************************************/
#include<iostream>
#include<cmath>
using namespace std;

int main()
{
int num,Max,number[200][200],dp[200][2],CMax[200],flag[200][200]={0};
cout<<"请输入整数个数:"<<endl;
cin>>num;
cout<<"请输入整数组:"<<endl;
for(int i=0;i<num;i++)
cin>>number[0][i];
for(int i=1;i<num;i++)/**********二维数组转化**********/
{
for(int j=0;j<num-1;j++)
number[i][j]=number[i-1][j+1];
number[i][num-1]=number[i-1][0];
}

for(int i=0;i<num;i++)/***********第N行**********/
{
for(int j=1;j<num+1;j++)/***********前N个**********/
{
dp[j][0]=max(dp[j-1][0],dp[j-1][1]);
dp[j][1]=max(dp[j-1][1]+number[i][j],number[i][j]);
if(number[i][j]==dp[j][1])
{
for(int k=0;k<j;k++)
flag[i][k]=0;
flag[i][j]=1;
}
else if(dp[j-1][1]+number[i][j]==dp[j][1])
flag[i][j]=1;
CMax[i]=max(dp[j][0],dp[j][1]);
}
}
Max=CMax[0];
int k;
for(int i=0;i<num-1;i++)
{
if(Max<CMax[i])
{
Max=CMax[i];
k=i;
}
}
cout<<"子数组为:"<<endl;
for(int j=0;j<num;j++)
{
if(flag[k][j]==1)
cout<<number[k][j]<<"    ";
}
cout<<endl;
cout<<"和为:"<<Max<<endl;
return 0;
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: