1.一个在不能使用万能头文件的网站可能会出现的错误\temp\21607497.34484\Main.cpp(11) : error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'std::string' (or there is no aceptable conversion) istream(1000): could be'std::basic_istream<_Elem,_Traits>
缺少头文件string
2.在做区间DP第二题括号匹配时发现的一个问题
(输入)
([][][)
end
因为end为截至符号,所以定义的字符串应先判断是否等于end,可以的写法有
string a;
while(cin>>a)
{
if(a=="end") break;
或者可以a[0]=='e',甚至cin>>a&&a!="end"也可以,但前提都是cin输入,如果用scanf则上述几种都不行,目前还没发现为什么,可能是输入的存储方式不同
并且,对于string a类型的字符串,求其长度,不能用strlen,可用int len=a.length();
3.关于区间DP循环时变量正序倒序的问题
最终目标是用到的子区间时,全部为已经更新过的状态,并且保证执行答案dp[1][n]时所有子区间全部更新
还是以第二题为例
先来一个我一开始写的典型错误示范
for(int i=1;i<=len-1;i++)
for(int j=i+1;j<=len;j++)
{
if((a[i]=='('&&a[j]==')')||(a[i]=='['&&a[j]==']'))
dp[i][j]=max(dp[i][j],dp[i+1][j-1]+2);
for(int k=i;k<j;k++)
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);
}
最直观的错误是第一轮 i 循环就涉及了目标,但错误根源在于K循环,对于 dp[i][j],dp[i][k]更新了不是0,而dp[k+1][j]还未更新,而我们要保证这两个都是更新的,思想类似背包问题的简化,
for(int i=n;i>0;i--)
for(int j=i;j<=n;j++)
{
for(int k=i;k<j;k++)
dp[i] [j ]=…………
}
这个是我认为可以适用于大部分区间dp的格式,保证了子区间的更新,其中包含了dp[m][m]的情况(有些子序列题需要把自身,即单个数,看作1)如不需要dp[m][m](成组的,如上面这题,两个括号组合为0或2),可以简化为i=n-1,j=i+1,但不能直接搬到于第二题,因为cin输入的string数组从0开始记录,
个人感觉并没有要用更新过的数据就一定要某个变量正序或逆序的说法,关键是要根据实际情况调整ijk,让更新后的数据加入新一轮的循环,所以以上并不是标准格式
不得不承认我这周作业做的很差,连一半也没做到,远低于前几次,我对自己进行了反思,发现自己每天似乎进行着一个恶性循环,脑子转的慢,老师讲的快,恰巧这周的数分和物理又特别的难,很多内容仅靠课堂上一遍无法理解,平均下来一天三节课,要抄的东西又比较多,晚上看回放整理笔记不知不觉将近十点了,还要抽时间写心理的论文,做PPT,同时还要将晚上跑步作业的时间与codefroces的时间错开,确实有些力不从心,还好下周没有这么多事,可以多弥补上周漏掉的内容,然后就是打codeforces感受,一开始打div3觉得还好,前两题题基本上题目看懂就可以出思路,靠低保不至于掉的太狠,到了div2,明显感觉到了差距,没A一题,甚至有想直接关电脑睡觉的冲动,在codeforces上给人的感觉确实与平常做题不同,时间的限制容易让人紧张,找不出来错误就想先做下一题,最终哪题都没做好,另外暴露我的问题就是读题太慢,记得学长给我们展示时,扫了几眼就概括了出了题目,差距很大,还是应当多训练自己的心态,提高读题水平。