南阳OJ 1204 魔法少女
2017-07-10 10:06
183 查看
当我第一次看到这个题时首先想到的是用空间子节点来遍历,然而超时了,然后也就只能老老实实的用动态规划了。
我的第一次代码:
#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; }
相关文章推荐
- nyoj1204 魔法少女 线性DP
- NYOJ - 1204 - 魔法少女(动态规划)
- nyoj 1204魔法少女
- NYOJ 1204 魔法少女 简单DP
- nyist 1204 魔法少女
- NYOJ 诡异的电梯 && nyoj 1204 魔法少女
- nyoj1204魔法少女——动态规划
- NYOJ 1204 魔法少女(简单dp)
- NYOJ1204-魔法少女(动态规划)
- 南阳oj 题目66 分数拆分
- 01串---南阳OJ
- 南阳OJ独木舟上的旅行
- 南阳oj-最少步数
- 南阳oj 题目31 5个数求最值
- 南阳oj 题目242 计算球体积
- 南阳oj 题目198 数数
- 南阳 oj 语言入门 A Famous Music Composer
- 南阳oj 语言入门 A+B paoblem 题目477 题目844
- 南阳oj 一种排序 题目8
- 南阳OJ~~奇偶数分离