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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UVA - 10253 Series-Parallel Networks(递推式、记忆化搜索写法)

發(fā)布時間:2023/12/3 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVA - 10253 Series-Parallel Networks(递推式、记忆化搜索写法) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目:UVA-10253



題目翻譯(來自藍書):
串并聯(lián)網(wǎng)絡(luò)有兩個端點,一個叫源,一個叫匯,遞歸定義如下:

(1) 一條單獨的邊是串并聯(lián)網(wǎng)絡(luò)。

(2) 若G1和G2是串并聯(lián)網(wǎng)絡(luò),把它們的源和源接在一起、匯接在一起也能得到串并聯(lián)網(wǎng)絡(luò)。

(3) 若G1和G2是串并聯(lián)網(wǎng)絡(luò),把G1的匯和G2的源接在一起也能得到串并聯(lián)網(wǎng)絡(luò)。

其中規(guī)則(2)指的是并聯(lián)、規(guī)則(3)指的是串聯(lián)。串并聯(lián)網(wǎng)絡(luò)中兩點之間可以有多條邊,串聯(lián)或者并聯(lián)在一起的各個部分可以任意調(diào)換順序。

輸入正整數(shù)n(1<=n<=30),統(tǒng)計有多少個n條邊的串并聯(lián)網(wǎng)絡(luò)。

思路:基本和藍書的思路一致,不過我用的是記憶化搜索的寫法(不想抄代碼,想用自己的代碼風(fēng)格去寫)

d[i][j]=sum{C(f(i)+p-1,p)dp[i-1][j-pi] | p*i<=j} ()主要遞推式。
其中f(i)=dp[i-1][i],如果i==1的話 f(1)= 1;
細節(jié)可看代碼。

#include<bits/stdc++.h> #define INF 0x3f3f3f3f3f3f3f3f #define inf 0x3f3f3f3f #define FILL(a,b) (memset(a,b,sizeof(a))) #define re register #define lson rt<<1 #define rson rt<<1|1 #define lowbit(a) ((a)&-(a)) #define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0); #define fi first #define rep(i,n) for(int i=0;(i)<(n);i++) #define rep1(i,n) for(int i=1;(i)<=(n);i++) #define se secondusing namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int > pii; int dx[4]= {-1,1,0,0},dy[4]= {0,0,1,-1}; const ll mod=1000000000; const ll N =1e5+10; const double eps = 1e-4; const double pi=acos(-1); ll gcd(int a,int b){return !b?a:gcd(b,a%b);} ll dp[50][50]; ll c(ll n,ll m)//組合數(shù) {ll ans=1;for(ll i=1;i<=m;i++){ans*=(n-i+1);ans/=i;}return ans; } ll dfs(ll i,ll j) {if(j==0) return 1;//邊界條件,一定要思考好if(i&&j==1) return 1;if(i==0) return 0;if(dp[i][j]>-1){return dp[i][j];}ll &ans=dp[i][j];ans=0;for(ll k=0;k*i<=j;k++){if(i==1) ans+=(dfs(i-1,j-(k*i)));//i==1 的情況f(1)=1;else ans+=(dfs(i-1,j-(k*i))*c(dfs(i-1,i)+k-1,k));}return ans; } void slove() {ll n;FILL(dp,-1);while(cin>>n&&n){if(n==1) cout<<1<<endl;else cout<<2*dfs(n-1,n)<<endl;} } int main() {iosint t=1;//cin>>t;while(t--){slove();}return 0; }

總結(jié)

以上是生活随笔為你收集整理的UVA - 10253 Series-Parallel Networks(递推式、记忆化搜索写法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。