[CODE【VS】]江哥的DP题d
来源:互联网 发布:优化9蒙古入侵 编辑:程序博客网 时间:2024/06/05 09:27
原题
江哥解题报告:
因为输入只有一个数,所以首先想到的是打表找规律
int dp(){ int i,j; memset(f,0,sizeof(f)); for(i=1;i<=n;i++){ f[i]=1; for(j=1;j<i;j++) if(a[i]<a[j] && f[j]+1>f[i]) f[i]=f[j]+1; } long long sum=0; for(i=1;i<=n;i++) sum=max(sum,f[i]); return sum;}void dfs(int i){ for(int j=n;j>=1;j--) if(!b[j]){ b[j]=1;a[i]=j; if(i<n)dfs(i+1); else if(dp()<=2){ ans++;ans%=Mod; } b[j]=0; }}
根据这样一段代码,可以发现如下规律:
- 1 1
- 2 2
- 3 5
- 4 14
- 5 42
显然,这就是卡特兰数,根据公式可得:
设f(i)为n为i的答案,那么f(i)=(f(i-1)*(4*i-2)/(i+1))%Mod;
但是,当你信誓旦旦地交上去使,你会发现只有30分,因为在除法意义下是没有取%的,所以要写一段高精度代码乘逆元,当然也有更简单的方法:
以下有syc dalao编写拿到样例之后,手玩一遍,列一个表: - 1 - 1 1 - 1 2 2 - 1 3 5 5 - ...第i行有i个数,表示以j开头的符合要求的排列有a(i,j)个仔细一看:f(i,j)=f(i,j-1)+f(i-1,j),这样就巧妙的避开了除法,避开了高精度和逆元,只需要取一个Mod
实现如下:
#include<stdio.h>#include<stdlib.h>using namespace std;const int Mod=1000000007;int f[1010][1010];int main(){ freopen("d.in","r",stdin); freopen("d.out","w",stdout); int i,j,k,n,m; scanf("%d",&n); f[1][1]=1; for(i=2;i<=n+1;i++) for(j=1;j<=i;j++) f[i][j]=(f[i-1][j]+f[i][j-1])%Mod; printf("%d\n",f[n+1][n+1]); return 0;}
阅读全文
0 0
- [CODE【VS】]江哥的DP题d
- [CODE【VS】]江哥的DP题a
- [CODE【VS】]江哥的DP题b
- code【vs】1380 没有上司的舞会(树形dp)
- Code Force 229 D (DP)
- VS Code的快捷键
- 【CODE VS】P1695 windows 2013(DP)
- code vs 1029 遍历问题 区间dp
- code vs 1378 选课(树形DP)
- 假期 code[vs]3622 dp+单调队列
- code vs 1520 回文字符串 (dp)
- code vs 1711 棋盘分割 (dp)
- code vs 1315 摆花 (dp)
- code(vs) 1154 能量项链 (区间dp)
- code(vs)1010 过河卒 (棋盘dp)
- code(vs)1219 骑士游历 (棋盘dp)
- code(vs)1220 数字三角形(普通dp)
- 区间DP code[vs]1258 关路灯
- 实验二 线性表综合实验(单链表)
- C++常用小知识点总结
- java List 排序 Collections.sort() 对 List 排序
- ACM算法:迪杰斯特拉最短路径
- leetcode Product of Array Except Self 生成除自己之外的数组
- [CODE【VS】]江哥的DP题d
- 1. STM32F10X-架构
- linux 命令小结
- python 爬虫爬取所有上市公司公告信息(一)
- SpringBoot24-spingboot数据访问-声明式事务
- 新建一个Maven Web项目jsp出现错误(关于Tomcat服务器)
- Java并发编程 07 Executors框架
- 通过 TensorFlow 进行的机器学习 如何帮助可口可乐实现移动购买凭证
- 人人可以机器学习!谷歌教你零编程基础玩转机器学习 ‖ github+教程