003. 翻硬币
解题思路:
因为把相邻两个硬币翻转两次相当于不翻,所以最优方案中同一组硬币最多只会翻转一次,故翻转顺序无后效性,考虑贪心:从前往后比较,发现一个不同的硬币就把它和他后面的硬币翻转,计数器累加,这样最后累加结果一定是最优方案的次数
AC代码:
#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
int main(){
string s1, s2;
cin >> s1 >> s2;
int l = s1.size(), cnt = 0;
for(int i = 0; i < l; i++)
{
if(s1[i] != s2[i]) //翻转
{
s1[i] = s1[i] == 'o'?'*':'o';
s1[i+1] = s1[i+1] == 'o'?'*':'o';
cnt++;
}
}
cout << cnt;
return 0;
}
翻转过程没看懂的看下面:
$a ? b:c $表示:
- 若 \(a\) 为真,返回 \(b\) 值
- 若 \(a\) 为假,返回 \(c\) 值