博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
The Battle of Chibi
阅读量:5905 次
发布时间:2019-06-19

本文共 2025 字,大约阅读时间需要 6 分钟。

给出一段长度为n的序列\(\{a_i\}\),求其中长度为m的严格上升子序列个数\(mod\ 10^9+7\),\(n\leq 10^3\)

不难想到设\(f[i][j]\)表示以第i个位置结尾,长度为j的LSIS,因此我们有

\[f[i][j]=\sum_{k=1,a_i>a_k}^{i-1}f[k][j-1]\]

边界:\(f[i][1]=1,i=1,2,...,n\),其余为0

答案:\(\sum_{i=1}^nf[i][m]\)

注意到这是\(O(n^3)\)算法,优先考虑转移优化,问题实际上是要寻找前面\(a_k\)小于\(a_i\)的f前缀和,考虑给a排序,也就是给a离散化,在离散化的数组里面建立前缀和数据结构(如线段树,树状数组),每次在对应的位置上查询修改前缀和,于是可以优化为\(O(n^2log^n)\)

参考代码:

#include 
#include
#include
#include
#define il inline#define ri register#define yyb 1000000007using namespace std;struct Map{ int a[1001],b[1001],n; il void prepare(int m,int ar[]){ n=m; for(ri int i(1);i<=n;++i) a[i]=ar[i];sort(a+1,a+n+1); for(ri int i(1);i<=n;++i)b[i]=dfs(ar[i]); } il int look(int x){ return b[x]; } il int dfs(int x){ int l(1),mid,r(n); while(l<=r){ mid=l+r>>1; if(x>a[mid])l=mid+1; else r=mid-1; }return l; }}L;struct lowbit{ int n,a[1001]; il void prepare(int m){ n=m,memset(a,0,sizeof(a)); } il void change(int p,int v){ while(p<=n)(a[p]+=v)%=yyb,p+=-p&p; } il int ask(int p){ int ans(0); while(p)(ans+=a[p])%=yyb,p-=-p&p;return ans; }}ar;int a[1001],dp[1001][1001];il void read(int&),work();int main(){ int lsy,i;read(lsy); for(i=1;i<=lsy;++i)printf("Case #%d: ",i),work(); return 0;}il void work(){ int n,m;read(n),read(m); for(int i(1);i<=n;++i)read(a[i]); L.prepare(n,a),memset(dp,0,sizeof(dp)); for(int i(1);i<=n;++i)dp[i][1]=1; for(int i,j(2);j<=m;++j){ ar.prepare(n); for(i=1;i<=n;++i) dp[i][j]=ar.ask(L.look(i)-1), ar.change(L.look(i),dp[i][j-1]); }int ans(0); for(int i(1);i<=n;++i)(ans+=dp[i][m])%=yyb; printf("%d\n",ans);}il void read(int &x){ x&=0;ri char c;while(c=getchar(),c<'0'||c>'9'); while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();}

转载于:https://www.cnblogs.com/a1b3c7d9/p/10958341.html

你可能感兴趣的文章
iOS推送消息报错误“Domain=NSCocoaErrorDomain Code=3000”的可能问题
查看>>
kvm-1
查看>>
leetcode 64. Minimum Path Sum
查看>>
textkit
查看>>
CentOS7+CDH5.14.0安装CDH错误排查: HiveServer2 该角色的进程已退出。该角色的预期状态为已启动...
查看>>
The Oregon Trail 俄勒冈之旅
查看>>
Excel VBA连接MySql 数据库获取数据
查看>>
Developing a Service Provider using Java API(Service Provider Interface)(转)
查看>>
oschina程序开发
查看>>
nested exception is java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter
查看>>
“正在注册字体”问题解决
查看>>
iOS开发-OpenGL ES入门教程1
查看>>
Java 设计模式专栏
查看>>
使用ASP.NET Atlas SortBehavior实现客户端排序
查看>>
图像滤镜处理算法:灰度、黑白、底片、浮雕
查看>>
Office文档出错的几种原因与解决方法
查看>>
正则表达式 学习笔记1.1
查看>>
AssetBundle进阶内存优化(Unity 4.x)
查看>>
《从零开始学Swift》学习笔记(Day 40)——析构函数
查看>>
Exchange2003-2010迁移系列之十,Exchange证书攻略
查看>>