标签:
//求最大子数组和 张鹏宇 武于微 /**************************************************************** 题目要求: 用户输入整数组,首尾相接,寻找最大子数组,求出其和,并返回子数组位置 思路: 用户随机输入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; }
运行结果截图:
体会:
这次的题目是上次题目的升级版本,要求数组可成为一个环,即首尾相接返回最大子数组的和,并返回子数组,比上次题目有些难度,关键是数组的首尾相接并判断跳出来返回,经过多次思路的转换达到效果,不过还有仍待改进的不足之处,继续努力。
结对的小伙伴博客:http://www.cnblogs.com/fooreveryu/
标签:
原文地址:http://www.cnblogs.com/wuyw/p/5325252.html