这周关于格式的方面的收获就是
ios::sync_with_stdio(0);
cin.tie(0);
可以节省cin的时间,让他和scanf一样
其余的收获主要还是关于思维方面,
1.有关求最大子段和的问题,如果一个字段和小于0,按理说应该将和置为0,再加下一个数,但关键在于如何表达,如果计算和之后与0比较,会导致全是负数的最大子段和为0,所以正确的应该是先比较前一个与0的大小,然后再决定加还是从头开始。
错误示例
for(int i=1;i<=n;i++)
{
l[i]=max(l[i-1],s+a[i]);
s+=a[i];
if(s<0) s=0;
}
正确示例
for(int i=2;i<=n;i++)
{
if(l[i-1]<0) l[i]=a[i];
else l[i]=l[i-1]+a[i];
}
2.E题fatmouse speed,这道题我认为与众不同的地方在于要输出选了那些数,特别像bfs某道迷宫输出路径的题,所以我采取那题类似的做法,将记录最大和的数组定义为结构体,多设一个对应的变量front,用于记录他这个最大组的前一个数的序号
for(int i=1;i<=len;i++)
for(int j=i-1;j>0;j–)
{
if(a[i].w>a[j].w&&a[i].s<a[j].s&&dp[j].maxx+1>dp[i].maxx)
{
dp[i].maxx=dp[j].maxx+1;
dp[i].fro=j;
}
if(dp[i].maxx>ans)
{
ans=dp[i].maxx;
pos=i;
}
}
3.H题Employment Planning,这题思路很简单,就是设二维DP数组,一个表示这个月用的工人,我思路的缺陷是没有想到有一种情况可能是第一个月直接录用所需工人的最大数,所以我的第一个月录用的工人数始终是第一个月所需要的最小工人数。
这周我做的题感觉全是求满足各类条件的子段,思路也无一例外,几乎全是枚举出所有情况再取极值,题与题之间可以明显感受到有相似的地方,但自己的时间安排不妥当,做的题不多,还是应该加快形成思路的过程进而提高效率。
DP总结
最新推荐文章于 2025-05-07 09:27:15 发布