【題解】洛谷P1026[NOIP2001]統計單詞個數 區間DP+字串
阿新 • • 發佈:2018-12-15
參考了大佬題解中string的基操
#include<cstdio> #include<iostream> using namespace std; string str,ch,word[10]; int p,k,s,sum[510][510],dp[510][50]; bool Find(int l,int r) { string aim=str.substr(l,r-l+1); for(int i=1;i<=s;i++) if(aim.find(word[i])==0)return 1; return 0; } int main() { //freopen("in.txt","r",stdin); cin>>p>>k;str+='0'; for(int i=1;i<=p;i++) cin>>ch,str+=ch; int len=str.length()-1; cin>>s; for(int i=1;i<=s;i++) cin>>word[i]; for(int j=len;j;j--) for(int i=j;i;i--) { sum[i][j]=sum[i+1][j]; if(Find(i,j))sum[i][j]++; } for(int i=1;i<=k;i++) dp[i][i]=dp[i-1][i-1]+sum[i][i]; for(int i=1;i<=len;i++) dp[i][1]=sum[1][i]; for(int i=1;i<=len;i++) for(int j=1;j<i&&j<=k;j++) for(int l=j;l<i;l++) dp[i][j]=max(dp[i][j],dp[l][j-1]+sum[l+1][i]); cout<<dp[len][k]<<endl; }
總結
基操,皆坐,勿6