UVA580 Critical Mass
2013-02-12 14:00
274 查看
假设有n个cube, 那么有f(n)种危险的情况。
从左往右看,讨论前几位的情况:
L 那么有 f(n-1)
UL 那么有 f(n-2)
UUL 那么有 f(n-3)
UUUL 那么有 2^(n-4)
UUUUL 那么有 2^(n-5)
。。。。。。
所以, f(n)=f(n-1)+f(n-2)+f(n-3)+2^(n-4)...+1 (4<=n<=30)
这里的+1是 指全是U的情况。
弱弱地贴出下面的AC代码。
#include <iostream>
using namespace std;
const int maxsize=30;
long long int a[maxsize+5];
long long int two[maxsize+5];
void CalTwo()
{
two[0]=1;
for (int i =1; i<=maxsize-4; i++){
two[i]=two[i-1]<<1;
}
}
void calculate()
{
a[0]=0;
a[1]=0;
a[2]=0;
a[3]=1;
CalTwo();
for (int i = 4; i <= maxsize; i++){
for (int k = 1; k <= i; k++){
if (k <= 3){
a[i]+=a[i-k];
}
else {
a[i]+=two[i-k];
}
}
a[i]+=1;
}
}
int main()
{
int n;
calculate();
while(cin>>n && n!=0){
cout<<a
<<endl;
}
return 0;
}
从左往右看,讨论前几位的情况:
L 那么有 f(n-1)
UL 那么有 f(n-2)
UUL 那么有 f(n-3)
UUUL 那么有 2^(n-4)
UUUUL 那么有 2^(n-5)
。。。。。。
所以, f(n)=f(n-1)+f(n-2)+f(n-3)+2^(n-4)...+1 (4<=n<=30)
这里的+1是 指全是U的情况。
弱弱地贴出下面的AC代码。
#include <iostream>
using namespace std;
const int maxsize=30;
long long int a[maxsize+5];
long long int two[maxsize+5];
void CalTwo()
{
two[0]=1;
for (int i =1; i<=maxsize-4; i++){
two[i]=two[i-1]<<1;
}
}
void calculate()
{
a[0]=0;
a[1]=0;
a[2]=0;
a[3]=1;
CalTwo();
for (int i = 4; i <= maxsize; i++){
for (int k = 1; k <= i; k++){
if (k <= 3){
a[i]+=a[i-k];
}
else {
a[i]+=two[i-k];
}
}
a[i]+=1;
}
}
int main()
{
int n;
calculate();
while(cin>>n && n!=0){
cout<<a
<<endl;
}
return 0;
}
相关文章推荐
- uva 580-Critical Mass(动态规划)
- UVA 580 Critical Mass
- UVA 580 - Critical Mass(DP)
- uva 580 - Critical Mass(dp)
- 【组合数学】Critical Mass, UVa580
- UVa 580 - Critical Mass
- 例题10-13 UVA - 580 Critical Mass 危险的组合(递推)
- UVA 580 Critical Mass
- uva 580 Critical Mass(递推)
- uva 580 Critical Mass(递推)
- UVA 580 Critical Mass
- 【UVA】580-Critical Mass
- UVA 580(p331)----Critical Mass
- uva 580 Critical Mass
- UVa 580 (递推) Critical Mass
- UVA 580 Critical Mass——dp
- Uva 580 - Critical Mass 解题报告(递推)
- UVA580-Critical Mass
- UVa 580 Critical Mass
- UVA - 580 Critical Mass(dp 数学)