日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

UVa 10520【递推 搜索】

發布時間:2023/12/13 综合教程 27 生活家
生活随笔 收集整理的這篇文章主要介紹了 UVa 10520【递推 搜索】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

UVa 10520

哇!簡直惡心的遞推,生推了半天。。感覺題不難,但是惡心,不推出來又難受。。一不小心還A了[]~( ̄▽ ̄)~*,AC的猝不及防。。。

先遞推求出f[i][1](1<=i<=n-1),f[n][i](2<=i<=n)和f[i][j](2<=i<=n-1,1<=j<=i),再遞推一次求f[1][j](2<=j<=n),f[1][n]即為答案。其實不太肯定這樣是否一定正確,因為我沒有特別考慮j=0的邊界情況,感覺好像也用不到這個情況。而且要用long long,剛開始用int會WA。

Reference Code:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 typedef long long ll;
 7 ll f[30][30]={0};
 8 
 9 int main()
10 {
11     int n,an1;
12     while(scanf("%d%d",&n,&an1)==2)
13     {
14         memset(f,0,sizeof(f));
15         f[n][1]=an1;
16         for (int i=n-1;i>=1;i--){
17             f[i][1]=f[i+1][1]*2;
18         }
19         for(int i=2;i<=n;i++){
20             f[n][i]=f[n][i-1]*2;
21         }
22         for(int i=n-1;i>=2;i--){
23             for(int j=1;j<=i;j++){
24                 for(int k1=i+1;k1<=n;k1++){
25                     f[i][j]=max(f[i][j],f[k1][1]+f[k1][j]);
26                 }
27                 ll t=0;
28                 for(int k2=1;k2<j;k2++){
29                     t=max(t,f[i][k2]+f[n][k2]);
30                 }
31                 f[i][j]+=t;
32             }
33         }
34         for(int j=2;j<=n;j++){
35             for(int k=1;k<j;k++){
36                 f[1][j]=max(f[1][j],f[1][k]+f[k+1][j]);
37             }
38         }
39         cout<<f[1][n]<<endl;
40     }
41     return 0;
42 }

UVa 10520 遞推

后來又看到了有人用深搜寫,感覺其實好理解點而且不用想他們之間的遞推關系,按照要求往下搜就好,省點腦子,比賽的時候適合這種寫法。

Reference Code:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 typedef long long ll;
 7 ll f[25][25]={0};
 8 ll n,a;
 9 
10 ll calc(int i,int j)
11 {
12     if(f[i][j]!=-1)
13         return f[i][j];
14     if(i<j){
15         ll Max=0;
16         for(int k=i;k<j;k++){
17             ll tmp=calc(i,k)+calc(k+1,j);
18             Max=max(Max,tmp);
19         }
20         return f[i][j]=Max;
21     }
22     ll Max1=0,Max2=0;
23     if(i<n){
24         for(int k=i+1;k<=n;k++){
25             ll tmp=calc(k,1)+calc(k,j);
26             Max1=max(Max1,tmp);
27         }
28     }
29     if(j>0){
30         for(int k=1;k<j;k++){
31             ll tmp=calc(i,k)+calc(n,k);
32             Max2=max(Max2,tmp);
33         }
34     }
35     return f[i][j]=Max1+Max2;
36 }
37 int main()
38 {
39     while(cin>>n>>a)
40     {
41         memset(f,-1,sizeof(f));
42         f[n][1]=a;
43         f[1][n]=calc(1,n);
44         cout<<f[1][n]<<endl;
45     }
46     return 0;
47 }

UVa 10520 深搜

總結

以上是生活随笔為你收集整理的UVa 10520【递推 搜索】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。