2021.8.10
暑假学习部分总结,
1,程序中不仅数据在内存中,代码也同样放在内存中,函数的入口地址可以用指针来访问。
像sort(a,a+n+1,cmp)后面的cmp就是地址了。
2,函数指针(注意和返回指针类型的函数的区别。)
int a(int a){}
int (*p)(int a);
p=a;
(*p)就是一个指针。
a就是入口。赋值即可。
使用两种方法。
int f=p(5);int f=(*p)(5);
3,在结构体中自引用是违法的。但是自引用指针就不违法。
例如,strict a{ a *p;}
4,高精度加法中,加完之后一定要先给a[0]赋值,不要只在i2>0的里面赋值。
5,atoi可以讲字符串转换为整数,atof可以将字符串转换为玩浮点数。
二,
1,过河卒子问题上,在第一排和第一列中,如果中间有一个是🐴可以跳到的地方,那这一排或者是一列之后可能性全是零。
2,判断整除。
题意,有一个数组,数组中元素的符号可以任意改变,问是否可以将所有数改变符号之后形成k的倍数。
理解,因为最后求k的倍数,题目中又说0是任何数的倍数,所以最后只要求出的数能够整除k就可以了。如果求出的数是负数,那不用管只求整数就可以,因为只要把所有的符号取反就可以得到整数了。
题解,构建一个数组是前i个数形成的余数是j。dp[i][j]=dp[i-1][(j-a[i])%k]||dp[i-1][(j+a[i])%k]
因为j-a[i]可能是负值,所以要加上k,(j-a[i]+k)%k.
3,踩方格
题意,假设有一个边境无穷大的由格子组成的区域,每次只能走向北东西,而且走过的格子无法继续走,只要路程有一步不一样就是不同路,给定一定的步数,问有几种路线。
错误思路,这题很容易类比于墨水在纸面上向北东西扩散,但是是错误的,因为不同到达一个格子有不同的路线,比如到达上边的第二个格子随着步数的不同情况也不同。
正确思路,不能只算能够到达的最外部的情况相加,要考虑所有格子。
题解,将能够向北东西三个方向走的格子称为A类格子,只能走向北东或者北西的称为B类格子,那不难返发现,每次A类可以产生一个A类和两个B类,B类可以产生一个A类和一个B类,而每次所产生的AB类就是可以走到的格子,也就是路线。
4,逆波兰表达式
题意,逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。
理解,可以看出运算符的后边的两个数就是要处里的数,所以应该调用递归。
题解,
double f()
{cin>>c;
if(c==’+’) return f()+f()
else if(c==’-’) return f()-f()
else return atof©;}
5,放苹果🍎问题
有i个苹果和j个盘子,盘子都一样,苹果也都一样,问有几种方法。例如7 3? 5 1 1和1 1 5是一种情况。
思路,凭经验可以知道这种题应该是递归。一般的都是考虑最后一个苹果是否放入到盘子里,可是这道题是考虑最后一个盘子是否放苹果。
题解,当n1orn0orm1orm0 的时候返回1,当苹果数小于盘子数时,返回f(n,n)可以看出有些盘子必定用不到。当苹果数大于盘子数目时,两种情况,最后一个盘子不再放置苹果,那就是f(n,m-1),注意第二种情况,如果最后一个盘子之后放苹果,因为盘子都是一样的,所以要f(n-m,m’).