c语言 这道题该怎么做?没有思路

作者&投稿:进瑞 (若有异议请与网页底部的电邮联系)
这道c语言题哪里错了?应该如何在原思路上修改?~

一个错,f[n]这个表达是不被允许的。
定义数组,不论char还是int,方括号里必须是一个确定大小的整数。
如果有的书上有过什么int/char a[max]这种表达,那么前面一定有define max 100(或者一个其他的比较大的数字)这是宏定义,用max代替100,相当于max是数字100的代号。
而在你的程序里,n是变量,不是宏定义。

fun的参数p不能把它在fun内的修改带出来,所以出来后p还是指向了a
给你演示一下两种不同修改,

void fun(int * p) {
*p = 10; //这个可以带出来,修改了它指向的a变量
p= &b; //这个带不出来,修改了p自己

}

最大子矩阵,最大连续子数组进阶,动态规划初级,poj1050

题目描述:现给出一个N*N矩阵,要求求出拥有最大和的子矩阵的和。

例如:

这样的一个矩阵,最大子矩阵的和为15;

此题可以让人联想到求最大连续子数组,求最大子数组在上一篇文章中http://www.cnblogs.com/tz346125264/p/7560708.html。

分析:最大子矩阵可以看为求最大连续子数组拓展到二维数组上,因为矩阵的性质同样在横向竖向上需要连续,那么可以想办法将这个二维数组简化为求连续子数组。

思考:

1.要求最大子矩阵,必须保证每个矩阵都被浏览到,为了保证运行时间尽可能不要重复浏览同一矩阵,故需制定规则,规则定为用i表示起始行,j表示终止行,j>=i,再使用k对列进行遍历,即可覆盖所有矩阵。

2.进行化简成求连续子数组操作,以上为例,设i=2,j=4那么这个矩阵是这样,那么化为连续子数组即为4(9-4-1),11(2+1+8),-10(-6-4+0),1(2+1-2)

求这个连续数组的最大连续子数组和便是这个矩阵(以i=2作为起始行,j=4作为终止行)的最大子矩阵,如此,整个矩阵的最大子矩阵便是这些最大子矩阵中的最大值。

上代码:

#include<iostream>#include<cstring>using namespace std;int main(){    int n;    int a[101][101];    int temp[101];
cin>>n;    for(int i=1;i<=n;i++){        for(int j=1;j<=n;j++){
cin>>a[i][j];            /*
为什么要进行相加?
在化简为求连续最大子数组时,需要将i到j行的数进行相加sum(i,j),而这个sum{i,j}可有sum{0,j}-sum{0,i}得到
为此提前做出相加方便之后化简
*/
a[i][j]+=a[i-1][j];
}
}    int max = -10000;    for(int i=1;i<=n;i++){        for(int j=i+1;j<=n;j++){
memset(temp,0,sizeof(temp));            //求最大连续子数组操作
for(int k=1;k<=n;k++){                if(temp[k-1]>=0){
temp[k]=temp[k-1]+a[j][k]-a[i][k];
}else{
temp[k]=a[j][k]-a[i][k];
}                if(temp[k]>max){
max = temp[k];
}
}
}
}
cout<<max<<endl;    return 0;
}



百度贪心算法有详细说明介绍,说实话这道题我最简单最麻烦的做法要把所有的矩阵出现的例子都对比一下,看谁大,因为我不是数学家,所以我推荐你百度下列关键词

求子数组的最大值(贪心算法)




岫岩满族自治县18064226197: 一个c语言题目,程序怎么写,完全没有思路 -
郦怪红花: 开一个NxN二维数组(足够大),往里面顺时针螺旋式填数,然后把数组中的数打印出来就完成了. 顺时针螺旋式填数的办法:顺时针边界行走.数组先填全0,定义边界宽度为所输入的数,然后从0行0列开始,向右按增加列号依次填数,直到到达边界(比如输入5,边界就是4),然后固定列号不变,按行增加填数,到达列边界再固定行号减小列号填数,再按减小行号填数...,如果遇到边界已经填数(不为0),则由行列填写转换.如此直到填完.

岫岩满族自治县18064226197: C语言一道小题~没思路啊~~~~~~~~~~跪谢~~~
郦怪红花: 如果是按照从大到小的顺序排列 则可以这样 比如我们输入的x 当前数组存放了20,18,16,14,12,10,8,6,4,2, 则把x放到最后一位 即当前数组为18,16,14,12,10,8,6,4,2,x 如果这个数组为a[100] 则a[9]=x; a[8]=2 如果x比2大 将x与2交换位置 变成了 18,...

岫岩满族自治县18064226197: C语言一道题的思路 我不要过程 说说简单的思路就行 谢谢了 急求!!!!! -
郦怪红花: 定义数组,for循环,scanf输入.然后排序,选择排序两层循环,把第一个当成最大的依次和后面的比,如果比第一个大就交换.已经排好序了,折半查找就方便了.

岫岩满族自治县18064226197: C语言:这道题应该怎么做呢?我大概结构明白可是还是有些问题...跪谢~~~~ -
郦怪红花: 【例】把一个整数按大小顺序插入已排好序的数组中. 为了把一个数按大小插入已排好序的数组中,应首先确定排序是从大到小还是从小到大进行的.设排序是从大到小进序的,则可把欲插入的数与数组中各数逐个比较,当找到第一个比插入数...

岫岩满族自治县18064226197: c语言高手来看一下啊!我这道题没有思路!不知道怎么写,帮一下忙啊!用if .....else解决.
郦怪红花: #include <iostream> #define max(a,b) ((a)>(b)?(a):(b)) const int inf=0x7fffffff; using namespace std; int main() {int Max=-inf;char c;while(cin>>c&&c!='\n') Max=max(Max,c); cout<<c<<endl; }

岫岩满族自治县18064226197: 请问一下这个C语言编程题怎么做(对于稍微有点基础人的来说很简单),很急,谢谢!! -
郦怪红花: 第一题(用数组编程)随机产生10个30~100(包括30,100)的正整数,求最大值,最小值,平均值,并显示整个数组的值和结果.第二题(用数组编程)定义二维数组A[6][6],将其对角线元素全变为0,并以矩阵形式输出数组.第三题(用函数...

岫岩满族自治县18064226197: C语言的一道小练习题,找不到思路,关于算法的 -
郦怪红花: 楼上正解,把条件判断修改了下,可能更好理解:1表示先取,0表示后取 for(i=11;i<=1000;i++) { if(List[i-1]==0 ||List[i-5]==0 ||List[i-10]==0) List[i]=1;//只要取1或5或10后,list[]值为0,即剩余数应该后取,那么就取,//取的数是使条件成立对应里的...

岫岩满族自治县18064226197: 学习c语言,作为初学者在编写程序时很没有思路,怎么做才能提高? -
郦怪红花: 要学习C语言.首先说明你想做编程,我也是刚学C不久,前期找方向找了一段时间,但是现在看来,学习的效果还不错.我就是看视频教学配合QQ群配合书来学的,捷径倒是没有,本身自己上班,只能不断的利用下班吃完饭的时间来学,很苦,因为毕竟是休息的时间用来充电,一定要坚持住,不断的敲代码,看代码,理解思路,希望对你有所帮助!

岫岩满族自治县18064226197: 这道C语言题目该怎么做? -
郦怪红花: #include<stdio.h> main() { int x=8,y=6,z=4; /* x,y,z分别表示长,宽,高 */ int c,s,v; /* c,s,v分别表示长方体的周长,面积,体积 */ c=4*(x+y+z); s=2*(x*y+y*z+x*z); v=x*y*z; printf("c=%d,s=%d,v=%d",c,s,v); }

岫岩满族自治县18064226197: 请问这道c语言程序题怎么做呀 -
郦怪红花: 观察puts(w)的位置不同时输出是不同的,因为开始第一次循环时w[i]即只有w[0]被赋值一次,就打印了,后面的w[i+1]等是不确定的.第二次循环的时候w[0]和w[1]被赋值,依次类推...其实把puts()字符串打印函数放在第25行就可以理解了...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网