七夕——永远在一起(一维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入门吧。