七夕——永远在一起(一维dp)

永远在一起

题目链接:https://ac.nowcoder.com/acm/contest/18962/I

题目描述:给定一个只有'W'、'F'、'?'三种字符组成偶数长字符串,'?'可以当做任意字符。统计其中有多少对'WF'、'FW'构成的子串。

 

某人:“I题以前也遇到过。”

“当时好像写了很久最后多了一个测试代码没注释,没过,印象深刻。”

“不对,I题优化上应该还得用二维DP。”

“如果连续没有'?',只要不中断就是+1+2+3这种递增,中断了就是回到1。”

“遇到?分情况讨论。”

然后,然后,很明显就WA掉了,题目判断跑偏但没有完全跑偏。测试数据case0%...

 

  AC代码:

#include <iostream>
using namespace std;

const int N = 200010;
int f[N][2];
string s;

int main()
{
    cin >> s;
    for(int i = 0; i < s.size(); i++)
    {
        if(s[i] == '?'){
            f[i][1] = f[i - 1][0] + 1;
            f[i][0] = f[i - 1][1] + 1;
        }
        else if(s[i] == 'W'){
            f[i][0] = f[i - 1][1] + 1;
        }
        else{
            f[i][1] = f[i - 1][0] + 1;
        }
    }
    long long res = 0;
    for(int i = 0; i < s.size(); i++)
        res += max(f[i][0], f[i][1]) / 2;
    cout << res << endl;
    return 0;
}

  这算是DP入门吧。

posted @ 2021-08-16 00:09  anyiya  阅读(29)  评论(0编辑  收藏  举报