最初の質問(サインインの質問)AC
最初の質問はかなり簡単に感じられたので、私は従来の方法を使用しました:最初にdpでF(N)の文字列を見つけ、次にmapをコンテナーとして使用して、各文字が出現する回数をカウントします。しかし、ポストをノックした後、メモリをバーストします。(質問した人は本当に鶏泥棒です)次に最適化を始めます
最適化のアイデア:
3つのマップを使用して、
map1はs1ではなくs1に出現した文字数を記録し、s2には0を記録します
map2は、s2ではなくs2に出現した文字数を記録し、s1には0を記録します。
map3は、最初にs1 + s2内の文字のすべての出現を0に設定し、次にmap3 = map1 + map2となるように1つずつ一致させます。
その後、それはdpであり、3つのマップは継続的に反復できます。
このようにして、スペースははるかに小さくなり、3つのマップのみが必要になります。
次に、コードが掲載されます。
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;
}
}
2番目の質問事件18.33
私はこの質問にポジティブな貪欲を使い始め、執筆後にcase18.33を実行しました。すると考えが限られていて、試験後にもう一度考えてみると、逆貪欲そうですね。