生活随笔
收集整理的這篇文章主要介紹了
UVA - 10253 Series-Parallel Networks(递推式、记忆化搜索写法)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目:UVA-10253
題目翻譯(來(lái)自藍(lán)書(shū)):
串并聯(lián)網(wǎng)絡(luò)有兩個(gè)端點(diǎn),一個(gè)叫源,一個(gè)叫匯,遞歸定義如下:
(1) 一條單獨(dú)的邊是串并聯(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ò)中兩點(diǎn)之間可以有多條邊,串聯(lián)或者并聯(lián)在一起的各個(gè)部分可以任意調(diào)換順序。
輸入正整數(shù)n(1<=n<=30),統(tǒng)計(jì)有多少個(gè)n條邊的串并聯(lián)網(wǎng)絡(luò)。
思路:基本和藍(lán)書(shū)的思路一致,不過(guò)我用的是記憶化搜索的寫(xiě)法(不想抄代碼,想用自己的代碼風(fēng)格去寫(xiě))
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;
細(xì)節(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
)
{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
)));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()
{ios
int t
=1;while(t
--){slove();}return 0;
}
總結(jié)
以上是生活随笔為你收集整理的UVA - 10253 Series-Parallel Networks(递推式、记忆化搜索写法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。