2021年4月12日-4月17日ACM学习日志

本周学习:继续学习经典dp,刷题理解巩固

突然想先写写感想:
这周代码的思路比上周想的快了许多,上星期真的是哪个题都是没思路,看题也不懂这个状态方程怎么来的,也不太理解状态方程各个量表示什么意思。在这周,每天稳定1到2题,由于现在白天课有点多,所以写代码的时间也就是晚上了,白天就看看题,思考思路。不过,现在在做题时,我知道我们现在做的题是锻炼dp的,但我觉都如果以后随便给我一个题,我还不能直接判断他是个dp题,在vjudge上的题时,明知是dp题,我总觉得不用dp就能做出来,然后就不用想,做,做着做着就走不通了,要不是错误答案,要不就是超时。说起超时,这绝对是这周里犯的最多的错误,运行没问题,一提交必超时,可能自己的思路不够优化,也可能自己开的数组过大,空间复杂度和时间复杂度太高。有个题我记着交了17次,之间还用了用滚动数组,不太会用,所以还是错误了,最后发现字符数组最后会默认输入一个\0,长度加一就行了,这才ac。这周我也对ACM有了自己的学习思路,我以前在课下不怎么看课件,都是遇见不会的了就查csdn,但渐渐的我觉得这样对于提高自己没有多大,所以我开始看课件,上课我知道我只能听个大概,所以在课下,早自习晚自习都是看dp课件,自己慢慢琢磨,一节课下来,就能看2,3页,但是我理解了啊,感觉比较充实吧。、

其次就是自己的做题时间和效率,以前做贪心算法的时候,我知道,自己确实存在着能给分的心理,经过一段时间,我开始改变,有作业时,赶紧做,尽管自己一开始做的比较慢,但做着做着自己就有自己独有的一套思路,慢慢做题,思考就快了许多。这周写代码快了很多也与自己定义的很多宏和对对freopen的使用和自己定义了自己熟悉的变量有关,下面看一下吧

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include <map>
using namespace std;
typedef long long  ll;
#define rep(m,n,h) for(int m=n;m<=h;m++)
#define cls(x) memset(x,0,sizeof(x))
const int maxn=INT_MAX;
const int N=5005;
const int mod=1e9+7;
int  num,y,temp,ans,k,m,n,i,j,h,f,dp[N][N],dp2[N],minn,ma,sum,t;
int a[N],b[N],c[N];
bool x;
char st[5005];
map <char,ll> s;
int main()
{

    freopen("C:\\Users\\lenovo\\Desktop\\in.txt","r",stdin);
        return 0;
}

做一个题时,可能定义了一些变量和头文件,然后我就没删,以后可以直接用,经过一周,我发现,用freopen来调试自己的代码真的快了很多,在次之间,我也对一些知识有了更多的认识,对于STL中的知识也会自己运用了,有时候想用,但又不会,就翻老师假期给的算法笔记,再加强记忆理解,争取灵活运用。

下面说一下自己做dp的遇到一些问题:
对dp有了更深的理解,就在状态方程上,以前我都不知道怎么写状态方程,就像HDU6143,定义了个二位数组dp[N[N],dp[i][j]表示对于长度为i,用了j种颜色的情况数,我以前就是不理解为什么要这样设,现在,我知道,dp题中循环一次,算出了状态方程就是把所有的结果算出来了,接下来我们直接用即可,还发现状态方程中的各个量之间是有关系的,往往这个关系怎么得到是非常关键的。像这个题,dp[i][j]=dp[i-1][j]j+dp[i-1][j-1](m-j-1),理解起来就是,长度为i用了j种颜色的数目=长度为i-1用了j种颜色的数目j种颜色(第i个格是j种颜色中的其中一个)+长度为i-1用到j-1种颜色(m-(j-1))种颜色(第i个格是剩下的(m-(j-1))种颜色)这个题是我在晚自习的时候看的,我感觉对我很有启发,状态之间的关系是最重要的,分析这个状态可以有上一个量怎么得到的,有几种情况,逐一分析,真的,明白了这个题,我对dp有了更深的理解,也有点顿悟的感觉。

再说下一些比较使用的干货,有了思路,我可以更快的写出代码而不出错。
二分幂的快速计算:

long long  pow(long  x,long n)
{
    long long  res=1;
    while(n>0)
    {
        if(n&1) res=res*x;
        x=x*x;
        n>>=1;
    }
    return res;
}

字符快速读入:

int read()
{
	int f=1,ans=0;//f为符号标记,ans为最终读入的绝对值 ,记得ans一定要赋值为0
	char c;
	c=getchar();
	while(c<'0'||c>'9')//若c为符号 
	{
		if(c=='-')
		{
			f=-1;//改变符号标记 
		}
		c=getchar();//反复读入,直到读入数字为止 
	}
	while(c>='0'&&c<='9')//若c为数字 
	{
		ans=ans*10+c-'0';//将c从字符型修改为数字整型 
		c=getchar();
	}
	return ans*f;//加上符号标记 
}

这个字符快速输入我一开始没看懂,查了csdn才明白,挺实用的,加快我的代码速度。

经典dp有的题确实很难,很难理解,慢慢刷题吧,一天差不多1到2个题,对于贪心那次作业,自己确实实实在在有在思考题,也有了自己的学习方法,虽然有时候就是做不出来,但我心里就是喜欢那种思考题,然后ac的感觉。努力,有了题,不拖,带着紧张感做题。昨天晚上闲的无聊,做了下午dp题,晚上也不太想再dp题了,就看看了晚上的div2的题,虽然老师没让做,但真的没事了,就看看了,还是能做出的,只写了代码,由于太长时间没加入,昨晚就不能提交了,今早提交的就ac了,这也让我知道,遇见题,不要慌,不要过度紧张,适度紧张即可,看见题,不要觉得自己第一眼看了不会就放弃了,现在哪有看一眼就会的题啊,慢慢思考,你就会发现,有的题只是看起来让人琢磨不透,但仔细想想,还是不难的,嗯,就这些吧,刷题是提高自己的最快最基础最好的办法,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值