问题 G: 【动态规划】攀登宝塔,问题 H: 【动态规划】fstring字符串

人群淹没,你我不及诉说。一声雁过,往事如昨。只望离别不多,再赏盛世烟火。

                                           问题 G: 【动态规划】攀登宝塔

题目描述

有一天,贝贝做了一个奇怪的梦,梦中他来到一处宝塔,他想要从塔的外面爬上去。这座宝塔的建造特别,塔总共有n层,但是每层的高度却不相同,这造成了贝贝爬过每层的时间也不同。贝贝会用仙术,每用一次可以让他向上跳一层或两层,这时不会耗费时间,但是每次跳跃后贝贝都将用完灵力,必须爬过至少一层才能再次跳跃。贝贝想用最短的时间爬到塔顶,可是他找不到时间最短的方案,所以请你帮他找一个时间最短的方案,让他爬到塔顶(可以超过塔高)。贝贝只关心时间,所以你只要告诉他最短时间是多少就可以了。

 

输入

第1行一个数n (n≤10000),表示塔的层数。
接下来的n行每行一个不超过100的正整数,表示从下往上每层的所需的时间。

 

输出

一个数,表示最短时间。

 

样例输入

复制样例数据

5
3
5
1
8
4

样例输出

1
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
int N,sj[10010],dp[2][10010];
int main(){
    scanf("%d",&N);
    for(int i=1;i<=N;i++)
        scanf("%d",&sj[i]);
    for(int i=1;i<=N;i++){
        dp[1][i]=dp[0][i-1]+sj[i];
        if(i==1)
            dp[0][i]=dp[1][i-1];
        else
            dp[0][i]=min(dp[1][i-2],dp[1][i-1]);
        dp[0][i]=min(dp[0][i],dp[1][i]);
    }
    int jg=min(dp[0][N],dp[1][N]);
    printf("%d\n",jg);
    return 0;
}

                                     问题 H: 【动态规划】fstring字符串

题目描述

一个只包含A,B,C三种字符的字符串,如果其中有连续的3个由A,B,C各一个组成的子串,则称这个字符串为fstring字符串。
例如:BAACAACCBAAA就是一个fstring字符串,而AABBCCAABB则不是。
你的任务是计算只包含A,B,C三种字符且长度为n的这种字符串有多少个不是fstring字符串。

 

输入

一个整数n(l≤n≤30)。

 

输出

一个整数。

 

样例输入

复制样例数据

3

样例输出

21

 

提示

 

另一组数据 输入2输出9

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
ll dp[40];
int main(){
    int n;
    scanf("%d",&n);
    dp[1]=3,dp[2]=9;
    for(int i=3;i<=n;i++)
        dp[i]=dp[i-2]*3+(dp[i-1]-dp[i-2])*2;
    printf("%lld\n",dp[n]);
    return 0;
}

 

你可能感兴趣的:(石油大学)