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 @ 2024-02-07 19:38  纯粹的  阅读(16)  评论(0)    收藏  举报