下面来简单介绍一下这两周看的比较好的部分题和对在codeforces上的两场比赛(Div.3,Div.4)的心得体会
1、方格取数
题意:从左上到右下去两条路径,使得取得的数之和最大(同时需要注意的是N<=9,所以四层循环不会超时)
题解:我们考虑两个人同时走,就相当于数字三角形。状态转移方程为:f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k-1][l],f[i][j-1][k][l-1])+a[i][j]+a[k][l];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
for(int l=1;l<=n;l++)
{
f[i][j][k][l]=max(max(f[i-1][j][k-1][l],f[i-1][j][k][l-1]),max(f[i][j-1][k-1][l],f[i][j-1][k][l-1]))+a[i][j]+a[k][l];
if(i==k&&l==j)f[i][j][k][l]-=a[i][j];
}
}
}
}
题意:去买东西时有不同面值和数量的零钱,求出最大的硬币数量
题解:转化成完全背包问题外加上一个记录数目的数组(能选小的绝不选大的)
题意:一共有两轮,每一轮有N个任务数,共M个不应该为一轮的分配对数,随后M行,每行有两个类似的解决方案,类似的解决方案不应该分配到同一轮,如果有多个则随意输出两轮的解决方案,如果没有则输出IMPOSSIBLE
题解:dfs+背包(*重要*)
*对于某些理解不是很到位的题可以把答案复制下来,然后运行自己随意输入,判断自己的理解是否正确*
因为长时间也没在codeforces上打比赛的缘故吧,突然一打Div.3还真是挺突然的,AC出1题,怎么说呢,其实也不是很满意,状态也调整的也比较慢,读题也比较慢.。
在Div.4中(AC出3题)有一道Dfs类型的题目,当时看到时就想到用Dfs,但写着写着发现dfs怎么写,怎么递归,当时也懵住了,于是就在main函数中内的两层for循环内加入了5个一层一层的if语句,虽然最终也AC出来,但是也体现出自己还是对dfs和bfs不熟悉,还得在洛谷和codeforces上看看搜索类的题。
突然一想,其实这两周复习光背背就行,也在复习时对很多的知识进行了理解,考完才感觉浪费了时间,真的是对于一些比较水的课背背就行了,而不需要死扣。