P2585 [ZJOI2006] 三色二叉树

原题链接

总结

1.要学会动态规划这种思维方式,即定义状态和状态之间的转移
2.本题的难点在于如何将抽象的输入数据转换成树状结构处理和定义状态,这个定义状态让我想到了初中添加几何线,可能要多做题才能有感觉吧
3.有一定模拟的部分,这一部分要细心

Code

#include<bits/stdc++.h>
using namespace std;
int len=0;
string s;
int f1[500005][3]={0},f2[500005][3]={0};
void ss(int now)
{
    if(s[now]=='0')
    {
        f1[now][0]=1;
        f2[now][0]=1;
        return;
    }

    ss(++len);
    if(s[now]=='1')
    {
        f1[now][0]=max(f1[now+1][1],f1[now+1 ][2])+1;
        f1[now][1]=max(f1[now+1][0],f1[now+1][2]);
        f1[now][2]=max(f1[now+1][0],f1[now+1][1]);

        f2[now][0]=min(f2[now+1][1],f2[now+1][2])+1;
        f2[now][1]=min(f2[now+1][0],f2[now+1][2]);
        f2[now][2]=min(f2[now+1][0],f2[now+1][1]);
    }
    else
    {
        int k=len;
        ss(++len);
        f1[now][0]=max(f1[now+1][1]+f1[k+1][2],f1[now+1][2]+f1[k+1][1])+1;
        f1[now][1]=max(f1[now+1][2]+f1[k+1][0],f1[now+1][0]+f1[k+1][2]);
        f1[now][2]=max(f1[now+1][1]+f1[k+1][0],f1[now+1][0]+f1[k+1][1]);

        f2[now][0]=min(f2[now+1][1]+f2[k+1][2],f2[now+1][2]+f2[k+1][1])+1;
        f2[now][1]=min(f2[now+1][2]+f2[k+1][0],f2[now+1][0]+f2[k+1][2]);
        f2[now][2]=min(f2[now+1][1]+f2[k+1][0],f2[now+1][0]+f2[k+1][1]);
    }
}
int main()
{
    cin>>s;
    ss(len);

    cout<<max(f1[0][0],max(f1[0][1],f1[0][2]))<<" "<<min(f2[0][0],min(f2[0][1],f2[0][2]));
    return 0;
}

posted @   纯粹的  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示