人群淹没,你我不及诉说。一声雁过,往事如昨。只望离别不多,再赏盛世烟火。
问题 G: 【动态规划】攀登宝塔
题目描述
有一天,贝贝做了一个奇怪的梦,梦中他来到一处宝塔,他想要从塔的外面爬上去。这座宝塔的建造特别,塔总共有n层,但是每层的高度却不相同,这造成了贝贝爬过每层的时间也不同。贝贝会用仙术,每用一次可以让他向上跳一层或两层,这时不会耗费时间,但是每次跳跃后贝贝都将用完灵力,必须爬过至少一层才能再次跳跃。贝贝想用最短的时间爬到塔顶,可是他找不到时间最短的方案,所以请你帮他找一个时间最短的方案,让他爬到塔顶(可以超过塔高)。贝贝只关心时间,所以你只要告诉他最短时间是多少就可以了。
输入
第1行一个数n (n≤10000),表示塔的层数。
接下来的n行每行一个不超过100的正整数,表示从下往上每层的所需的时间。
输出
一个数,表示最短时间。
样例输入
复制样例数据
5 3 5 1 8 4
样例输出
1
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#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 <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#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;
}