3月29日にNetease Leihuo筆記試験(人生で最初の筆記試験)

最初の質問(サインインの質問)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を実行しました。すると考えが限られていて、試験後にもう一度考えてみると、逆貪欲そうですね。

181のオリジナル記事を公開 13のような 訪問者10,000以上

おすすめ

転載: blog.csdn.net/qq_43461641/article/details/105187415