第一題(簽到題)AC
第一題剛開始覺得挺簡單,就按常規方法:先dp求出F(N)的字符串,然後用map做容器計每個字母出現的次數。但是敲完了往上一貼,爆內存了。(出題人真雞賊啊)然後開始優化
優化思路:
用3個map,
map1記錄s1中出現過的字符的次數,s1中沒出現,s2中出現的,這裏記0。
map2記錄s2中出現過的字符的次數,s2中沒出現,s1中出現的,這裏記0。
map3先將s1+s2中所有出現過字符的次數爲0,然後逐個匹配使得map3=map1+map2。
之後就是dp,3個map不斷迭代即可。
這樣一來空間就小很多了,只需要3個map。
然後代碼往上一貼,ac了。
貼個ac代碼:
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int z;
cin >> z;
string s1, s2, s3;
cin >> s1 >> s2;
s3 = s1 + s2;
map<char, int> mci1, mci2, mci3;
map<char, int>::iterator it;
for (int i = 0; i < s1.size(); i++)mci1[s1[i]]++;
for (int i = 0; i < s2.size(); i++)mci2[s2[i]]++;
if (z == 1)for (it = mci1.begin(); it != mci1.end(); it++)cout << it->first << ":" << it->second << endl;
else if (z == 2)for (it = mci2.begin(); it != mci2.end(); it++)cout << it->first << ":" << it->second << endl;
else
{
for (int i = 0; i < s2.size(); i++)if (mci1.find(s2[i]) == mci1.end())mci1[s2[i]] = 0;
for (int i = 0; i < s1.size(); i++)if (mci2.find(s1[i]) == mci2.end())mci2[s1[i]] = 0;
for (int i = 0; i < s3.size(); i++)mci3[s3[i]] = 0;
for (int i = 3; i <= z; i++)
{
for (it = mci3.begin(); it != mci3.end(); it++)mci3[it->first] = mci1[it->first] + mci2[it->first];
for (it = mci1.begin(); it != mci1.end(); it++)mci1[it->first] = mci2[it->first];
for (it = mci2.begin(); it != mci2.end(); it++)mci2[it->first] = mci3[it->first];
}
for (it = mci3.begin(); it != mci3.end(); it++)cout << it->first << ":" << it->second << endl;
}
}
第二題 case18.33
這題我開始用的正向貪心,寫完跑了一下case18.33。然後思維就侷限了,考完再想了一下,似乎逆向貪心可以?