Hello CNBLOGS!Hello Everyone!
这是我的第一篇blog,所以这也是一篇试验性的blog。
这个学期我和很多同学一样选修了邹欣老师的现代程序设计这门专业课。第一次看到使用GitHub、写博客这样高大上的作业要求,我感觉很兴奋也很有压力。也希望能在这门课上通过自己的努力,取得更多的收获和更大的进步。
这里要说明一点:“第一次作业的截止日期是9月20号”,可是这个消息发布的时候却恰逢中秋佳节,我和不少同学一样都不在学校。而当我22号回来的时候才发现了“迟交作业者一律0分”的这个悲情消息。
助教学长:第一次的作业确实不是本人故意不交,实在是事出有因,所以在此向您表示道歉,希望您能原谅。不奢求能加回什么分数,但求把情况说明,以后避免这类问题再次发生。
那么现在补完成第一次作业的内容:
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int i,n,f[2][1001]={0},a[1001]={0}; 6 printf("Please enter the number of input:"); 7 scanf("%d",&n); 8 printf("Then please enter your input:"); 9 for(i=1;i<=n;i++){ 10 scanf("%d",&a[i]); 11 } 12 f[0][1]=a[1];f[1][1]=a[1]; 13 for(i=2;i<=n;i++){ 14 if(f[1][i-1]+a[i]>=f[0][i-1] && f[1][i-1]+a[i]>=a[i])f[0][i]=f[1][i-1]+a[i]; 15 if(f[1][i-1]+a[i]<=f[0][i-1] && f[0][i-1]>=a[i])f[0][i]=f[0][i-1]; 16 if(f[1][i-1]+a[i]<=a[i] && f[0][i-1]<=a[i])f[0][i]=a[i]; 17 if(f[1][i-1]>=0)f[1][i]=f[1][i-1]+a[i]; 18 else f[1][i]=a[i]; 19 //f[0][i]=f[1][i-1]+a[i] f[0][i-1] a[i]; 20 //f[1][i]=f[1][i-1]+a[i] a[i] 21 } 22 printf("The maximum value of sub-array is :%d\n",f[0][n]); 23 system("pause"); 24 return 0; 25 }
算法描述:
对于输入一维数组a[] 定义
f[0][i] 表示从a数组第0号元素到第i号元素的子数组中的 最大子数组和
f[1][i] 表示从a数组第0号元素到第i号元素的子数组中的 最大子数组和(其中a[i]元素必须被选取)
则存在以下递推式:
f[0][i]=max{f[1][i-1]+a[i],f[0][i-1],a[i]}
f[1][i]=max{f[1][i-1]+a[i],a[i]}
所求出f[0][n]即为题目要求从a数组第0号元素到第n号元素的子数组中的 最大子数组和
算法时间复杂度O[n]
所解决元素规模与a数组定义的大小有关(故本例只能解决1000个元素以下的问题)
至此这篇blog差不多就结束了哈,祝好~! Elendir