数组会越界,可以试试在s后先加一个‘0’在从字符串的第一位开始;
最后正着处理,不然会有重复覆盖了,还有就是等于号去不去的问题;
~~手动试试~~
AC代码:
```cpp
#include<bits/stdc++.h>
using namespace std;
int p,k,n;
int sum[205][205];
int dp[205][45];
map <int ,map<int ,int> > m;//map[i][j] 从i到j的单词数
string s;
string ss[10];
int check(int l,int r){
string now=s.substr(l,r-l+1);
for (int i=1;i<=n;i++){
if(now.find(ss[i])==0) return 1;
}
return 0;
}
int main(){
cin>>p>>k;
s+='0';
for (int i=1;i<=p;i++){
string x;
cin>>x;
s+=x;
}
cin>>n;
for (int i=1;i<=n;i++){
cin>>ss[i];
}
for (int i=s.size()-1;i>=1;i--){
for (int j=i;j>=1;j--){
sum[j][i]=sum[j+1][i];
if(check(j,i)) sum[j][i]++;
}
}
for(int i=1;i<=s.size()-1;i++)
{
dp[i][1]=sum[1][i];
dp[i][i]=dp[i-1][i-1]+sum[i][i];
}
for (int i=1;i<=s.size()-1;i++){
for (int j=1;j<=k&&j<i;j++){
for (int k=j;k<i;k++){
dp[i][j]=max(dp[i][j],dp[k][j-1]+sum[k+1][i]);
}
}
}
cout<<dp[s.size()-1][k];
return 0;
}
```
by aoprpl @ 2021-11-09 18:38:22
谢谢yuhao!!!
by q_james_c @ 2021-11-09 21:18:38