C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了dp专题题目记录大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

1.数的划分    2星

https://ac.nowcoder.com/acm/problem/16695

dp专题题目记录

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define eps 1e-6
 5 int ans=0;
 6 int n,k;
 7 void dfs(int id,int sum,int val)
 8 {
 9     /*if(id == k-1 && sum + val <= n){  //存在最后一个数字n-sum>=val   集合里面的数字是递增的 
10         ans++;
11         return;
12     }
13     for(int i = val; i <= n; i++){
14         if(sum + i >n)
15             break;
16         dfs( id + 1,sum + i,i);
17     }*/ 
18    if(id==k&&sum==n)
19     {
20         ans++;
21         return;
22      }
23       
24     if(id>=k||sum>n)
25     return;
26     
27     for(int i = val; i <= n; i++){
28         if(sum+i>n)
29         break;
30         dfs(id+1,sum+i,i);
31     }
32 }
33  
34 int main()
35 {
36     while(scanf("%d %d",&n,&k) != EOF){
37         ans = 0;
38         dfs(0,0,1);
39         printf("%d\n",ans);
40     }
41     return 0;
42 }
View Code

 

2.单词接龙   3星

dp专题题目记录

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 struct node{
 5     char s[22];
 6     int len;
 7     int v;//被选的次数 
 8 }c[22];
 9 int n,maxn;
10 
11 void dfs(int x,int len){//当前单词序号   目前龙的长度 
12     for(int i=1;i<=n;i++){   //可以选n种单词 
13         if(c[i].v<2)//被选的次数小于2 
14         {
15             for(int j=0;j<c[x].len;j++){   //判断前一个单词是否和当前所选的单词有相等的地方 
16                 if(c[x].s[j]==c[i].s[0]){   
17                 int k=1,t=1,l;
18                 for(l=j+1;l<c[x].len&&k<c[i].len;++k,++l){
19                     if(c[x].s[l]!=c[i].s[k])
20                     {
21                         t=0;   break;
22                     }
23                 }
24                 if(l!=c[x].len)  //说明单词i被单词x包含 
25                 t=0;
26                 if(t)  //说明单词x与单词i相连且不被包含 
27                 {
28                     c[i].v++;
29                     dfs(i,len+c[i].len-k);  
30                     c[i].v--;
31                 }                
32                 }
33             }
34         }
35     }
36     maxn=@H_921_29@max(maxn,len);
37 }
38 
39 int main(){
40     cin>>n;//单词数
41     for(int i=1;i<=n;i++){
42     cin>>c[i].s;//一个单词内容 
43     c[i].len=strlen(c[i].s);//一个单词长度 
44     }
45     cin>>c[0].s;//成语接龙首字母    
46     c[0].len=strlen(c[0].s);
47     
48     dfs(0,c[0].len);
49     cout<<maxn<<endl;
50 }
View Code
使用dfs的情况:搜索值最大的方案
方案由几个x组成,x又有n种方案,对x进行dfs
void dfs(int X)
{
for(int i=0;i<n;i++)
...
}

大佬总结

以上是大佬教程为你收集整理的dp专题题目记录全部内容,希望文章能够帮你解决dp专题题目记录所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。