dp专题题目记录

1.数的划分    2星

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

 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星

 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=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++)
...
}

猜你喜欢

转载自www.cnblogs.com/Aiahtwo/p/11391017.html