C++ 2009年谷歌代码堵塞解决“欢迎使用代码堵塞”
我试图解决以下代码阻塞问题,我取得了一些进展,但在少数情况下,我的代码输出错误。。 所以我偶然发现了一个来自俄罗斯的dev rem的解决方案。 我不知道他/她的解决方案是如何正确运行的。。代码C++ 2009年谷歌代码堵塞解决“欢迎使用代码堵塞”,c++,C++,我试图解决以下代码阻塞问题,我取得了一些进展,但在少数情况下,我的代码输出错误。。 所以我偶然发现了一个来自俄罗斯的dev rem的解决方案。 我不知道他/她的解决方案是如何正确运行的。。代码 const string target = "welcome to code jam"; char buf[1<<20]; int main() { freopen("input.txt", "rt", stdin); freopen("output.tx
const string target = "welcome to code jam";
char buf[1<<20];
int main() {
freopen("input.txt", "rt", stdin);
freopen("output.txt", "wt", stdout);
gets(buf);
FOR(test, 1, atoi(buf)) {
gets(buf);
string s(buf);
int n = size(s);
int k = size(target);
vector<vector<int> > dp(n+1, vector<int>(k+1));
dp[0][0] = 1;
const int mod = 10000;
assert(k == 19);
REP(i, n) REP(j, k+1) {// Whats happening here
dp[i+1][j] = (dp[i+1][j]+dp[i][j])%mod;
if (j < k && s[i] == target[j])
dp[i+1][j+1] = (dp[i+1][j+1]+dp[i][j])%mod;
}
printf("Case #%d: %04d\n", test, dp[n][k]);
}
exit(0);
}//credit rem
有人能解释一下这两个循环中发生了什么吗
谢谢。他在做什么:动态规划,到目前为止你也能看到 他有2D数组,你需要理解它的语义。 事实上,dp[i][j]使用输入字符串中直到第i个索引的所有字母,计算他可以获得代码jam的前j个字母的子序列的方法的数量。这两个索引都是基于1的,以允许不从字符串中提取任何字母 例如,如果输入为:
welcome to code jjam
不同情况下的dp值将为:
dp[1][1] = 1; // first letter is w. perfect just the goal
dp[1][2] = 0; // no way to have two letters in just one-letter string
dp[2][2] = 1; // again: perfect
dp[1][2] = 1; // here we ignore the e. We just need the w.
dp[7][2] = 2; // two ways to construct we: [we]lcome and [w]elcom[e].
您特别询问的循环根据已计算的动态值计算新的动态值。他在做什么:动态编程,到目前为止,您也可以看到 他有2D数组,你需要理解它的语义。 事实上,dp[i][j]使用输入字符串中直到第i个索引的所有字母,计算他可以获得代码jam的前j个字母的子序列的方法的数量。这两个索引都是基于1的,以允许不从字符串中提取任何字母 例如,如果输入为:
welcome to code jjam
不同情况下的dp值将为:
dp[1][1] = 1; // first letter is w. perfect just the goal
dp[1][2] = 0; // no way to have two letters in just one-letter string
dp[2][2] = 1; // again: perfect
dp[1][2] = 1; // here we ignore the e. We just need the w.
dp[7][2] = 2; // two ways to construct we: [we]lcome and [w]elcom[e].
您特别询问的循环根据已计算的动态值计算新的动态值。哇,几天前我在练习这个问题,偶然发现了这个问题 我怀疑,如果你不学习DP,说他在做动态规划并不能解释太多 我可以给出更清晰的实施和更简单的解释:
string phrase = "welcome to code jam"; // S
string text; getline(cin, text); // T
vector<int> ob(text.size(), 1);
int ans = 0;
for (int p = 0; p < phrase.size(); ++p) {
ans = 0;
for (int i = 0; i < text.size(); ++i) {
if (text[i] == phrase[p]) ans = (ans + ob[i]) % 10000;
ob[i] = ans;
}
}
cout << setfill('0') << setw(4) << ans << endl;
要解决这个问题,如果S只有一个字符S[0],我们可以只计算它出现的次数
如果它只有两个字符S[0..1],我们可以看到每次出现T[i]==S[1]都会增加索引i之前S[0]出现的次数
对于三个字符S[0..2],每次出现T[i]==S[2]时,索引i之前的答案同样会增加S[0..1]出现的次数。该数字与上一段处理T[i]时的答案值相同
如果有四个字符,答案将是在找到第四个字符的每个索引之前,前三个字符的出现次数增加,依此类推
由于每隔一步都会使用前一步的值,因此可以逐步解决此问题。在每一步p上,我们需要知道在任何索引i之前的子串S[0..p-1]的出现次数,这些子串可以保存在与T长度相同的整数ob数组中。然后,每当我们在i处遇到S[p]时,答案就会增加ob[i]。为了为下一步准备ob,我们还将每个ob[i]更新为S[0..p]的出现次数,即更新为当前答案值
最后,最新答案值和ob的最后一个元素包含整个T中出现的整个S的数量,这就是最终答案
请注意,它以ob开头,并用1填充。第一步不同于其他步骤;但计算S[0]的出现次数意味着每次出现时答案增加1,这是所有其他步骤都要做的,除了它们增加ob[i]。因此,当每个ob[i]最初都是1时,第一步将像所有其他步骤一样运行,使用相同的代码。哇,几天前我在练习这个问题,偶然发现了这个问题 我怀疑,如果你不学习DP,说他在做动态规划并不能解释太多 我可以给出更清晰的实施和更简单的解释:
string phrase = "welcome to code jam"; // S
string text; getline(cin, text); // T
vector<int> ob(text.size(), 1);
int ans = 0;
for (int p = 0; p < phrase.size(); ++p) {
ans = 0;
for (int i = 0; i < text.size(); ++i) {
if (text[i] == phrase[p]) ans = (ans + ob[i]) % 10000;
ob[i] = ans;
}
}
cout << setfill('0') << setw(4) << ans << endl;
要解决这个问题,如果S只有一个字符S[0],我们可以只计算它出现的次数
如果它只有两个字符S[0..1],我们可以看到每次出现T[i]==S[1]都会增加索引i之前S[0]出现的次数
对于三个字符S[0..2],每次出现T[i]==S[2]时,索引i之前的答案同样会增加S[0..1]出现的次数。该数字与上一段处理T[i]时的答案值相同
如果有四个字符,答案将是在找到第四个字符的每个索引之前,前三个字符的出现次数增加,依此类推
由于每隔一步都会使用前一步的值,因此可以逐步解决此问题。在每一步p上,我们需要知道在任何索引i之前的子串S[0..p-1]的出现次数,这些子串可以保存在与T长度相同的整数ob数组中。然后,每当我们在i处遇到S[p]时,答案就会增加ob[i]。为了准备下一步的ob,我们还将每个ob[i]更新为NUMBE
S[0..p]的出现次数的er-即当前答案值
最后,最新答案值和ob的最后一个元素包含整个T中出现的整个S的数量,这就是最终答案
请注意,它以ob开头,并用1填充。第一步不同于其他步骤;但计算S[0]的出现次数意味着每次出现时答案增加1,这是所有其他步骤都要做的,除了它们增加ob[i]。因此,当每个ob[i]的初始值为1时,第一步将像所有其他步骤一样运行,使用相同的代码。哦,孩子,这里有一个提示:不要试图从这段代码中学习。把问题贴在这里怎么样?其余的问题放在piece REM中。一位非常优秀的程序员,去世时非常年轻。你可以看到你仍然有影响力,而不是被遗忘。@R.MartinhoFernandes为什么?它的方法是错误的吗??有什么不对吗?@BorisStrandjev你刚才是在开REM的玩笑吗?哦,孩子,这里有一个提示:不要试图从这个代码中学习。把这个问题贴在这里怎么样?其余的都贴在REM上。一个非常好的程序员,很年轻就去世了。你可以看到你仍然有影响力,而不是被遗忘。@R.MartinhoFernandes为什么?它的方法是错误的吗??“这有什么不对吗?”鲍里斯·特兰德耶夫你刚才是不是在开REM的玩笑?