当前位置: 首页 > news >正文

[SDOI2010] 地精部落(简单dp)

https://www.luogu.com.cn/problem/P2467

一开始想错方向,小丑了

f ( i , j , 0 / 1 ) f(i,j,0/1) f(i,j,0/1) 表示还剩 i i i 个,上一个在剩余数里面排名为 j j j,之前是上升/下降的方案数,转移显然

滚一下前缀和就好

#include<bits/stdc++.h>
using namespace std;
#ifdef LOCAL#define debug(...) fprintf(stdout, ##__VA_ARGS__)
#else#define debug(...) void(0)
#endif
#define int long long
inline int read(){int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;
ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+
(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
#define fi first
#define se second
//#define M
//#define mo
#define N 4300
int n, m, i, j, k, T, mo;
int f[N][2], g[N][2]; signed main()
{#ifdef LOCALfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);#endif
//	srand(time(NULL));
//	T=read();
//	while(T--) {
//
//	}n = read(); mo = read(); for(i = 1; i <= n; ++i) f[i][0] = f[i][1] = 1; for(i = n - 1; i >= 1; --i) {memcpy(g, f, sizeof(f)); for(j = 1, k = 0; j <= i; ++j) (k += g[j][1]) %= mo, f[j][0] = k; for(j = i, k = 0; j >= 1; --j) (k += g[j + 1][0]) %= mo, f[j][1] = k; }printf("%lld", (f[1][0] + f[1][1]) % mo); return 0;
}

http://www.mrgr.cn/news/24426.html

相关文章:

  • 多个时间序列的滞后相关性
  • JAVA学习-练习试用Java实现“最小覆盖子串”
  • 东土科技加码芯片业务投资,携手神经元共建新型工业生态
  • 编码与实现
  • 体育数据API纳米足球数据API:足球数据接口文档API示例⑩
  • 基于ts写法的一些 项目中会有所用到的功能函数
  • 区块链当前发展和未来展望
  • JavaScript高级——关于语句分号的问题
  • 如何在Windows系统上使用谷歌浏览器进行远程工作
  • Agent引领“ComfyUI全新升级” | 用户简单描述需求,“自动生成”完美工作流图,绝对吸睛!
  • Java——多态
  • MySQL内置函数
  • F-32产生了额外的行项目
  • 开放式耳机和骨传导耳机哪个对耳朵好?开放式耳机哪个牌子好?
  • ctfshow-web入门-sql注入(web244-web247)error 报错注入
  • 想报考pmp,一定得经过培训机构吗?
  • 从零到一,数字文创IP是如何在基地中孵化成长的?
  • 一文搞懂EureKa原理
  • postgresql 导出CSV格式数据
  • Android Studio新建工程(Java语言环境)