首页 > 其他分享 >Codeforces Round 113 (Div. 2)E. Tetrahedron(dp、递推)

Codeforces Round 113 (Div. 2)E. Tetrahedron(dp、递推)

时间:2024-02-13 21:34:39浏览次数:30  
标签:int Tetrahedron Codeforces long 113 mod dp define

目录

题面

image

链接

E. Tetrahedron

题意

从一个顶点出发走过路径长度为n回到出发点的方案总数

题解

考虑dp
\(f[i][0|1|2|3]\):走了i步,现在在j点的方案总数
转移:
\(f[i][0]=f[i-1][1]+f[i-1][2]+f[i-1][3]\)
\(f[i][1]=f[i-1][0]+f[i-1][2]+f[i-1][3]\)
\(f[i][2]=f[i-1][0]+f[i-1][1]+f[i-1][3]\)
\(f[i][3]=f[i-1][0]+f[i-1][1]+f[i-1][2]\)

代码

#include <bits/stdc++.h> 
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define pll pair<long long, long long>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back

using namespace std;
const int mod=1e9+7;
int dp[3][5];
void solve()
{
	int n;
	cin>>n;
	dp[0][0]=1;
	rep(i,1,n){
		int u=i&1,v=(i-1)&1;
		dp[u][0]=(dp[v][1]+dp[v][2]+dp[v][3])%mod;
		dp[u][1]=(dp[v][0]+dp[v][2]+dp[v][3])%mod;
		dp[u][2]=(dp[v][0]+dp[v][1]+dp[v][3])%mod;
		dp[u][3]=(dp[v][0]+dp[v][1]+dp[v][2])%mod;
	}
	cout<<dp[n&1][0]<<endl;
}

signed main(){
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//   	freopen("1.in", "r", stdin);
  	int _;
//	cin>>_;
//	while(_--)
	solve();
	return 0;
}

总结

一定要开long long,容易忘直接\(define long long int\)
爆空间开滚动数组优化。

标签:int,Tetrahedron,Codeforces,long,113,mod,dp,define
From: https://www.cnblogs.com/cxy8/p/18014831

相关文章

  • Codeforces Round 169 (Div. 2)C. Little Girl and Maximum Sum(差分、贪心)
    目录题面链接题意题解代码总结题面链接C.LittleGirlandMaximumSum题意给q个[l,r]将所有这些区间里面的数相加和最大。可以进行的操作是任意排列数组题解对出现的每个区间内的位置加上1,代表权值操作完之后求一遍前缀和,得到每个位置的权值然后贪心的考虑,权值越大,应......
  • CodeForces 1928F Digital Patterns
    洛谷传送门CF传送门为什么我场上被卡常了。转化题意,将\(a,b\)差分,答案为在\(a,b\)选出相同长度的不含\(0\)的子段方案数。设\(a\)选出长度为\(i\)的不含\(0\)的子段方案数为\(x_i\),\(b\)选出长度为\(i\)的不含\(0\)的子段方案数为\(y_i\)。答案为\(\su......
  • Codeforces Round 729 (Div. 2)B. Plus and Multiply(构造、数学)
    题面链接B.PlusandMultiply题意给定\(n,a,b\)可以进行的操作\(*a\)\(+b\)最开始的数是1问能否经过上面的两种操作将1变为n题解这题的关键是能不能想出来这个集合里面的数的统一的表达形式所有数都可以表示为\(a^x+y*b\)然后只要存在\(x\)和\(y\),使得\(a^x+y*......
  • Codeforces Round 922 (Div. 2) A~C
    A.BrickWall#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn,m;cin>>n>>m;intans=n*(m/2);cout<<ans<<"\n";}intmain(){ ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int......
  • Codeforces Round 923 (Div. 3)
    A.MakeitWhite#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ inta,b,n; strings; cin>>n>>s; for(inti=0;i<n;i++){ if(s[i]=='B'){ a=i; break; } } for(inti=n-1;i>=0;i--){ if(s[i]=='B&......
  • Codeforces Round 924 (Div. 2)
    B.Equalize与数组的原始顺序无关,直接排序,然后用双指针滑动范围a[r]-a[l]小于n#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;voidsolve(){ intn; cin>>n; set<int>st; for(inti=1;i<=n;i++){ intx; cin>>x; st.insert(x); } ......
  • Codeforces Round 924 (Div. 2)
    1928D-LonelyMountainDungeons题意:有\(n\)个种族,第\(i\)个种族\(c_i\)个生物,现在要将这些生物分成若干组,每一对不在同一组但是同一种族的生物会对这种分组的价值贡献\(b\),如果分了\(k\)组,则价值要减去\((k-1)x\),求最大价值。\(n\le10^5,\sumc_i\le10^5\)思......
  • Codeforces Round 303 (Div. 2)C. Kefa and Park(DFS、实现)
    @目录题面链接题意题解代码总结题面链接C.KefaandPark题意求叶节点数量,叶节点满足,从根节点到叶节点的路径上最长连续1的长度小于m题解这道题目主要是实现,当不满足条件时直接返回。到达叶节点后统计答案,用vector存图的话,无向图时,叶节点的边只有一条,也就是\(g[i].size()......
  • Codeforces Round 924 (Div. 2)B. Equalize(思维+双指针)
    目录题面链接题意题解代码题面链接B.Equalize题意给一个数组\(a\),然后让你给这个数组加上一个排列,求出现最多的次数题解赛时没过不应该。最开始很容易想到要去重,因为重复的元素对于答案是没有贡献的。去重后排序。,然后维护一个极差小于n-1的区间,,区间长度就是可能的答案......
  • P1113 杂务
    一眼拓扑排序。但是发现可以同时做多件杂务,这就需要我们考虑好每件杂务的完成时间。显然,一件杂务要开始做,一定是该杂务的准备都完成,所以开始时间应该选择准备中最晚的完成时间。怎么处理这个时间?考虑一件杂务的“入度”是怎么变成\(0\)的,显然是队列中靠前的准备杂务到后面的......