自己的代码,有点丑,嘿嘿。。
一直很奇怪,为什么100 50 0输出的是1。难道是不进攻也是一种选择?
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
#define LL __int64
LL f[33][333];
double pows(double a,LL b)
{
double s=1;
while(b)
{
if(b&1)
s=s*a;
a=a*a;
b=b>>1;
}
return s;
}
int main()
{
//freopen("D:\\test.txt","r",stdin);
//freopen("D:\\in.txt","w",stdout);
LL a,b,t;
while(scanf("%I64d%I64d%I64d",&a,&b,&t)!=EOF)
{
LL i,j,k,n,m,ans;
n=t/30+(t%30)/15;
m=b-a+t/30+1;
memset(f,0,sizeof(f));
f[0][0]=1;
if(m<1)
{
ans=(LL)pows(3.0,n);
printf("%I64d\n",ans);
continue;
}
if(m==1)
{
if(n>0)ans=(LL)pows(3.0,n);//被pow坑了半天,用库里的,由于返回是int的,超了。。
else ans=0;
printf("%I64d\n",ans);
continue;
}
for(i=1;i<=n;i++)
{
for(j=1;j<m+4;j++)
{
if(j==1)
f[i][j]=f[i-1][j-1];
else if(j==2)
f[i][j]=f[i-1][j-1]+f[i-1][j-2];
else
f[i][j]=f[i-1][j-1]+f[i-1][j-2]+f[i-1][j-3];
}
f[i][m]=f[i][m]+f[i][m+1]+f[i][m+2]+f[i][m+3];
f[i][m+1]=f[i][m+2]=f[i][m+3]=0;
}
printf("%I64d\n",f[n][m]);
}
return 0;
}
别人的,看起来简洁多了。。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long dp[25][205];
int main()
{
//freopen("D:\\test.txt","r",stdin);
//freopen("D:\\out.txt","w",stdout);
int a,b,t;
while(scanf("%d%d%d",&a,&b,&t)!=EOF)
{
memset(dp,0,sizeof(dp));
int turn=t/15,tot=turn/2+(turn&1);
dp[0][0]=1;
for(int i=1;i<=tot;i++)
{
for(int j=i-1;j<=(i-1)*3;j++)
{
if(dp[i-1][j])
{
dp[i][j+1]+=dp[i-1][j];
dp[i][j+2]+=dp[i-1][j];
dp[i][j+3]+=dp[i-1][j];
}
}
}
long long ans=0;
for(int i=max(tot,b-a+turn-tot+1);i<=tot*3;i++)
ans+=dp[tot][i];
cout<<ans<<endl;
}
}