当我第一次看到这个题时首先想到的是用空间子节点来遍历,然而超时了,然后也就只能老老实实的用动态规划了。
我的第一次代码:
#include<stdio.h>
int n,a[10010],s;
void F(int m,int h,int t){//m为飞过的层数
if(m+h>n){
if(s>t)
s=t;
return;
}
if(m==0){
t+=a[h];
//F(0,h+1,t);
F(1,h+1,t);
F(2,h+1,t);
}
else
F(0,h+m,t);
}
int main(){
int i;
while(scanf("%d",&n)!=EOF){
s=10000000;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
F(0,1,0);
F(1,1,0);
F(2,1,0);
printf("%d\n",s);
}
}
我们可以从题目中知道,少女每上三楼,都必须要走一层楼,所以我们可以利用这个来进行动态规划。
改进后,使用的动态规划:
#include<stdio.h>
int a[10005],dp[10005]={0};
int min(int b,int c,int d){
int pai[2],i;
pai[0]=c;
pai[1]=d;
for(i=0;i<2;i++)
if(b>pai[i])
b=pai[i];
return b;
}
int main(){
int i,n;
while(scanf("%d",&n)!=EOF ){
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
if(n>3){
dp[0]=0;
dp[1]=a[1];
dp[2]=a[2];
for(i=3;i<=n+1;i++)
dp[i]=min(dp[i-1],dp[i-2],dp[i-3])+a[i];
printf("%d\n",dp[n+1]);
}
else if(n==3){
printf("%d\n",min(a[1],a[2],a[3]));
}
else
printf("0\n");
for(i=0;i<=n+1;i++){
a[i]=0;
dp[i]=0;
}
}
return 0;
}