2021-04-17

ACM第六周学习总结

这一周的学习较前一周有了改变,对于动态规划有了一定理解,做题也有了些思路。
动态规划是求解每一阶段最优解,而每一阶段可能并不完全相同,但一定会存在本质相同之处,状态转移就是寻找相同,联系全体。但寻找状态转移方程并不能急于一时,上来就写很容易出错。要去了解每一阶段的不同之处,将所有可能考虑,综合写出状态转移方程。

做题收获

Functions again
此题运用目的是求相邻两项绝对值分别取正负时,构成的两组序列中和最大的一组。题意比较简单,既然要求和的最大值,就要求各项,得到每一项求和即可。

for(i=1;i<m;i++)
{if(i%2==1){b1[i]=abs(a[i]-a[i+1]);b2[i]=-b1[i];}else {b1[i]=-abs(a[i]-a[i+1]);b2[i]=-b1[i];}}

2.flowers
土拨鼠只能吃连续为k的白花或者只吃红花求土拨鼠在不同花数下可以吃的最多可能。首先还是先分析题目,题意大概就是当给出的花的数目<k时土拨鼠只能吃红花所以只有一种可能而当=k时则只有都是红花都是白花两种可能。把这些特殊情况先讨论出来,接着分析花数>k时的一般情况发现情况类似斐波那契数列即

dp[i]=dp[i-k]+dp[i-1];

最后将所有情况代入循环即可得到每一阶段(不同花数i)的可能。
3.
hdu 6143 组成名字数
给定m种不同字母,从字母中选出并组成长度均为n的合法名字,问有多少种?
要求名和姓的字母不能重复
看到题目,首先分析,既然要求字母不能重复,即当姓用到j个字母时,名就要用到m-j个字母。
然后就转化为将j种和m-j种颜色分配到n个格中的最多方法。然后就要知道j为多少?明显虽然名和姓不能重复,但只要当前姓中未出现则名中可以出现,所以j取[1,m]。最后考虑各状态之间的关系,(可由后往前推)

dp[i][j]=
dp[i-1][j]*j+dp[i-1][j-1]*(m-(j-1));

4.本周新内容区间dp
区间dp,我理解的是将某一阶段划分到一起算作一个点。以区间表示阶段求解。
vj遇到过类似(并不一样)的题目tickets
题目大意是每个人有不同的购票时间,而相邻的两人可以一同购票(有另外的购票时间)求所有人购票时间之和最小。
首先还是分析题意,即每个人可以和前后某个人一起购票也可以单独购票。很明显这时候不只前后两人有关系,第一个人和第三个人也有关系,若第一个人与第二个一同购票则第三个无法与第二个人一同购票。所以需要比较三人购票更合适的一组。分析特殊情况当只有一个人时即为这一个人的时间,若为两个人则要比较两个人之和与共同购票的大小关系。当两个人以上时,就要考虑三个人中最优方案。运用状态转移方程求解。

cin>>n;
for(i=1;i<=n;i++)
cin>>t1[i];a[1]=t1[1];
for(i=2;i<=n;i++)cin>>t2[i];
for(i=2;i<=n;i++)
a[i]=min(a[i-1]+t1[i],a[i-2]+t2[i]);
总结

以上是对部分题目的理解和做题思路的总结,这一周的学习主要是对二维动态规划的解题。二维不同于一维,二维中不同变量表示不同意义,如何正确得到状态转移方程很困难。这一周做题看了一些题解,经常发现原来思路这么简单,自己却会想的很复杂,从而导致程序又长又错。在此总结一个方法,当不知道程序再怎么进行的时候不妨先停一下,回到初始状态重新思考一下,本周到此结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值