Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 2009年谷歌代码堵塞解决“欢迎使用代码堵塞”_C++ - Fatal编程技术网

C++ 2009年谷歌代码堵塞解决“欢迎使用代码堵塞”

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

我试图解决以下代码阻塞问题,我取得了一些进展,但在少数情况下,我的代码输出错误。。

所以我偶然发现了一个来自俄罗斯的dev rem的解决方案。 我不知道他/她的解决方案是如何正确运行的。。代码

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的玩笑?