最大子数组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; }
相关文章推荐
- 状态压缩DP---Hie with the Pie
- git常用命令
- Linux之grub引导详情与故障排除
- 再写makefile
- AJAX
- cocos2d-x中文显示问题
- 3月第三四周小结(3.16~3.27)
- 第一章 第一个spring boot程序
- css的基本内容
- 修改 login的串口重定向
- Raspberry Pi Samba(Share Files With Mac OS)
- 基于BNF范式的M3中Schema板架语言的解析
- [Q]打印机页边距设置
- sqlite数据库文件导入到sqlserver
- linux下使用ccat让你的cat高亮显示
- C语言中#的神奇作用
- 菜鸟成长记-UILabel使用、横线划掉价格
- 5-1 源码包与RPM包的区别
- Java——新IO 缓冲区与Buffer
- 机器学习:梯度Boost决策树