1. 程式人生 > >【題解】洛谷P1026[NOIP2001]統計單詞個數 區間DP+字串

【題解】洛谷P1026[NOIP2001]統計單詞個數 區間DP+字串

題目連結 在這裡插入圖片描述 在這裡插入圖片描述

參考了大佬題解中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