递推
水水水水水
问题 A: 铺瓷砖
题目描述
用红色的 1×1 和黑色的 2×2 两种规格的瓷砖不重叠地铺满 n×3 的路面,求出有多少种不同的铺设方案。
输入
一行一个整数 n,0<n<1000。
输出
一行一个整数,为铺设方案的数量模12345的结果。
1:1
2:3
4:5
5:11
也就是2n+1,2n-1滴规律
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; int n,ans=1; int main() { ios::sync_with_stdio(false); cin>>n; if(n==1) cout<<ans; else { for(int j=2;j<=n;j++) { if(j%2==0) { ans=ans*2+1; } else { ans=ans*2-1; } ans%=12345; } } cout<<ans; return 0; }
问题 B: 彩带
题目描述
一中 90 周年校庆,小林准备用一些白色、蓝色和红色的彩带来装饰学校超市的橱窗,他希望满足以下两个条件:
(1) 相同颜色的彩带不能放在相邻的位置;
(2) 一条蓝色的彩带必须放在一条白色的彩带和一条红色的彩带中间。
现在,他想知道满足要求的放置彩带的方案数有多少种。例如,如图 所示为橱窗宽度n=3 的所有放置方案,共 4 种。
输入
一行一个整数 n,表示橱窗宽度(或者说彩带数目)。
输出
一行一个整数,表示装饰橱窗的彩带放置方案数。
样例输入 Copy
3
样例输出 Copy
4
提示
对 30% 的数据满足:1≤n≤15。
对 100% 的数据满足:1≤n≤45。
斐波那契数列,但前两项都是2
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; int n,f[50]; int main() { ios::sync_with_stdio(false); f[1]=f[2]=2; cin>>n; for(int j=3;j<=n;j++) { f[j]=f[j-1]+f[j-2]; } cout<<f[n]; return 0; }
1389: 城市路径
题目描述
地图上有 n 个城市,一只奶牛要从 1 号城市开始依次经过这些城市,最终到达 n 号城市。但是这只奶牛觉得这样太无聊了,所以它决定跳过其中的一个城市(但是不能跳过 1 号和 n 号城市),使得它从 1 号城市开始,到达 n 号城市所经过的总距离最小。假设每一个城市 i 都有一个坐标(x i ,y i ),从 (x 1 ,y 1 ) 的城市 1 到 (x 2 ,y 2 ) 的城市 2 之间的距离为 | x 1 -x 2 | + | y 1 -y 2 | 。
输入
第 1 行 1 个正整数 n,表示城市个数。
接下来的 n 行,每行 2 个数 x i 和 y i ,表示城市 i 的坐标。
输出
一行一个数,使得它从1号城市开始,跳过某一个城市,到达n号城市所经过的最小总距离。
样例输入 Copy
4
0 0
8 3
11 -1
10 0
样例输出 Copy
14
提示
【样例说明】
跳过 2 号城市。
【数据规模】
对于 40% 的数据满足:n≤1000。
对于 100% 的数据满足:3≤n≤100000,-1000≤x i ,y i ≤1000。
pz:这不是枚举吗?
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; int n,x[100005],y[100005],maxx,tot; int main() { ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++) cin>>x[i]>>y[i]; for(int i=2;i<=n;i++) { tot+=abs(x[i-1]-x[i])+abs(y[i-1]-y[i]); } for(int i=2;i<n;i++) { int save=(abs(x[i-1]-x[i])+abs(y[i-1]-y[i])+abs(x[i+1]-x[i])+abs(y[i+1]-y[i]))-(abs(x[i-1]-x[i+1])+abs(y[i-1]-y[i+1])); if(save>0&&save>maxx) maxx=save; } cout<<tot-maxx; return 0; }
2020/3/28 20:21 歇息一下
问题 D: 偶数个3
题目描述
编程求出所有的 n 位数中,有多少个数中有偶数个数字 3。
输入
一行一个正整数 n,0<n<1000。
输出
一行一个正整数,表示 n 位数中有多少个数有偶数个 3,这个数可能会很大,请输出它%12345的值。
样例输入 Copy
2
样例输出 Copy
73
2020/3/28 22:10
1408: 数塔问题
题目描述
若要求从根结点开始,请找出一条路径,使路径之和最大,只要输出路径的和。
输入
输出
样例输入 Copy
5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11
样例输出 Copy
86
pz:dpdpdp
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; int n,f[15][15],a[15][15],ans; int main() { ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { cin>>a[i][j]; } } f[1][1]=a[1][1]; for(int i=2;i<=n;i++) { for(int j=1;j<=i;j++) { f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j]; } } for(int i=1;i<=n;i++) { if(f[n][i]>ans) ans=f[n][i]; } cout<<ans; return 0; }