5 条题解
-
18
#include <bits/stdc++.h> using namespace std ; set<string> P[15] ; string s, z ; bool dp[200005] ; int len, m = 0, ans = 0 ; int main() { std::ios::sync_with_stdio(false) ; std::cin.tie(0) ; while(cin >> s) { if(s[0] == '.') break ; len = s.length() ; P[len].insert(s) ; m = max(m, len) ; } z = " " ; while(cin >> s) z = z + s ; len = z.length() ; dp[0] = 1 ; for(int i = 1; i < len; i ++)//此处为小于 { for(int j = min(i, m); j >= 1; j --) { s = z.substr(i - j + 1, j) ; if(P[s.length()].count(s) && dp[i - j]) { dp[i] = 1 ; ans = i ; } } } printf("%d\n", ans) ; }
-
7
用f[i]表示S的前i个字符是否满足条件,初始状态是f[0]=1。状态转移时,可以枚举P的每一个元素,如果它是S的前i个字符组成的字符串的后缀,那么可以把当前状态转移到去掉这个后缀之后的状态。最终答案是能够使f[i]等于1的最大的i。
核心代码
f[0] = 1; for (int i = 1; i <= s.size(); i++) for (int j = 1; j <= n; j++) if (i >= p[j].size() && s.substr(i - p[j].size(), p[j].size()) == p[j]) f[i] |= f[i - p[j].size()];
-
2
这是一道DP题
[USACO2.3] 最长前缀 Longest Prefix
这道题显然满足 1D/1D 动态规划的性质
我们开一个 类型的 数组,用 表示字符串前 个字符是否可以分解为集合中的字符串
为 的条件为:
- 存在一个比 小的 ,满足 为真,而且从 到 是集合中的一个元素
这里可以用到 函数来表示 从 到 的子串:
- 其中 为集合中某一元素的长度
以下是 100pts 代码:
#include<bits/stdc++.h> using namespace std; int ans,cnt=0; string str,p[205],x; bool dp[200005]; int main(){ for(string s;cin>>s,s!=".";p[cnt++]=s); for(string s;cin>>s;str+=s); dp[0]=true; for(int i=1;i<=str.size();i++){ dp[i]=0; for(int j=0;j<cnt;j++){ int len=p[j].size(); if(i>=len&&dp[i-len]&&p[j]==str.substr(i-len,len)){ ans=i; dp[i]=1; break; } } } cout<<ans<<endl; return 0; QwQ; }
难度:普及 / 提高-
-
-4
#include <bits/stdc++.h> using namespace std ; set<string> P[15] ; string s, z ; bool dp[200005] ; int len, m = 0, ans = 0 ; int main() { std::ios::sync_with_stdio(false) ; std::cin.tie(0) ; while(cin >> s) { if(s[0] == '.') break ; len = s.length() ; P[len].insert(s) ; m = max(m, len) ; } z = " " ; while(cin >> s) z = z + s ; len = z.length() ; dp[0] = 1 ; for(int i = 1; i < len; i ++)//此处为小于 { for(int j = min(i, m); j >= 1; j --) { s = z.substr(i - j + 1, j) ; if(P[s.length()].count(s) && dp[i - j]) { dp[i] = 1 ; ans = i ; } } } printf("%d\n", ans) ; }
-
-22
#include <bits/stdc++.h> using namespace std ; set<string> P[15] ; string s, z ; bool dp[200005] ; int len, m = 0, ans = 0 ; int main() { std::ios::sync_with_stdio(false) ; std::cin.tie(0) ; while(cin >> s) { if(s[0] == '.') break ; len = s.length() ; P[len].insert(s) ; m = max(m, len) ; } z = " " ; while(cin >> s) z = z + s ; len = z.length() ; dp[0] = 1 ; for(int i = 1; i < len; i ++)//此处为小于 { for(int j = min(i, m); j >= 1; j --) { s = z.substr(i - j + 1, j) ; if(P[s.length()].count(s) && dp[i - j]) { dp[i] = 1 ; ans = i ; } } } printf("%d\n", ans) ; }
- 1
信息
- ID
- 266
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 648
- 已通过
- 348
- 上传者