C++ trie树加dp的问题

代码随想录
博客专家认证
2011-10-12 05:19:41
String Importance

TimeLimit: 1 Second MemoryLimit: 64 Megabyte

Totalsubmit: 0 Accepted: 0

Description

我们知道,在搜索的时候总有一些字符串是很重要,一些字符串是很冷门。现在有一个新串和一些模式串,都由26个小写字母组成,且都互不相同。我们已知这些模式串的重要度(由一个正整数代表),想由此推出新串的重要度。我们定义,一个新串的重要度为其中含有的模式串的重要度之和,其中模式串的计算不可重叠,同一模式串可以重复计算。

Input

有多组输入数据。每组数据的第一行为新串s(长度为ls,1<= ls <= 1000),和一个正整数n,代表模式串的个数。之后的n行,每行有一个模式串ti和一个正整数vi(模式串的重要度)。(ti长度为lti ,1 <= lti <= ls ,1 <= vi <= 100 ,1 <= n <= 100)

Output

新串的重要度最大是多少

Sample Input

begin 2
beg 1
gin 3
aaa 2
a 2
aa 3


Sample Output

3
6


Source


#include<iostream>
using namespace std;
char s[1005],t[1005];
int v[105];
int dp[1005];
#define max 26
int max1(int x,int y)
{
return x>y? x:y;
}
struct node
{
int num;
int end;
int len;
int sign;
int v;
node *next[max];
};
node *root;
void trie()
{
int i,j;
root=new node;
root->num=0;
root->end=0;
root->len=0;
root->sign=1;
for(int i=0;i<max;i++)
root->next[i]=NULL;
}
void insert(char ss[],int av)
{
node *p=root,*t;
int len=strlen(ss);
for(int i=0;i<len;i++)
{
if(p->next[ss[i]-'a']==NULL)
{
t=new node;
t->num=0;
t->end=0;
t->len=0;
for(int j=0;j<max;j++)
t->next[j]=NULL;
p->next[ss[i]-'a']=t;

}
p=p->next[ss[i]-'a'];
if(i==len-1)
{
// cout<<ss[len-1];
// system("pause");
p->end=1;
p->v=av;
p->len=len;
}

}
}
void search(char ss[])
{
// for(int i=1;ss[i];i++)
// cout<<ss[i];
// system("pause");
int supersign=0;
int temp[1005];
node *p=root;
int start=1;
int sign=0;

// system("pause");
for(int i=start;ss[i];i++)
{

if(sign==1)
{
i=start;
sign=0;
}
// cout<<"super"<<supersign;

// cout<<i<<' ';
// cout<<p->next['g'-'a'];
// system("pause");

// if(p->next['g'-'a']!=NULL)
// {
// cout<<i;
// system("pause");
// cout<<"haha "<<i;
// }
//if(p->sign==1)
//printf("haha");
if(p->next[ss[i]-'a']!=NULL)
{
// cout<<ss[i];
// system("pause");
p=p->next[ss[i]-'a'];
// cout<<ss[i]<<' ';
// system("pause");
if(p->end==1)
{

dp[i]=max1(dp[i],dp[i-(p->len)]+p->v);
sign=1;
start++;
node *p=root;//最关键就是这,没什么不好使啊!!!回去之后分明root所对应的‘g’-‘a’不是空的啊!!!!可就是不好使,我都开始怀疑c语言是不是有bugue了

// supersign=1;
// cout<<"p->v"<<p->v<<' '<<supersign;
// system("pause");
// break;
}
}
else
node *p=root;//最关键就是这,没什么不好使啊!!!

}
}
int main()
{
int n;
while(scanf("%s%d",s+1,&n)!=EOF)
{
int len=strlen(s+1);
trie();
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf("%s %d",t,&v[i]);
insert(t,v[i]);
}
// dfs (root);
search(s);
for(int i=1;i<=len;i++)
cout<<dp[i]<<' ';
system("pause");
}
return 0;
}
这道题是trie树加dp,求解释啊!!我快疯了,调了一宿了,再加上今天一天!!第一组数据按我的算发应该是00103啊!!可结果就是00100。我已经把每步都调试,跪求搭建看看啊!!!



...全文
132 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
only_lonely 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yuelengdihai 的回复:]

重复度怎么确定的,根据旧字符串的比例吗?介绍下思路吧
[/Quote]
嗯,学习一下。
cocoabird 2011-10-12
  • 打赏
  • 举报
回复
重复度怎么确定的,根据旧字符串的比例吗?介绍下思路吧
qq120848369 2011-10-12
  • 打赏
  • 举报
回复
你先给我们讲讲TRIE+DP的算法思路我们再帮你看看,互相学习。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧