hdoj3664【DP】
来源:互联网 发布:linux mint 18.2 编辑:程序博客网 时间:2024/05/18 02:29
题意:
有一种值E=the number of elements where ai > i.比如1 3 2 4,只有3位置是满足的,E=1。然后他会给你一个数组和一个k,问有多少个序列的E=k。
思路:
看到n和k都是1e3我觉得就应该想到n^2的复杂度上去,然后就是dp。不是说dp熟练,这就是一种解题思路的发现嘛,扯远了。。
dp[i][j]表示前i个数的排列中E值为j的个数。处理dp[i][j]就是对于第i个,加进去,①如果就是放在最后dp[i][j]+=dp[i-1][j] 不变。②如果放到的地方是a[k]>k的还是不变。③如果放到不是a[k]>k的,那么就是+1;
dp[i][j]+=dp[i-1][j]+dp[i-1][j]j+dp[i-1][j-1](i-j);
题外话:
感觉说起来还是有点难的,但是思路一旦明确,以及dp[i][j]的确立,状态转移,总体就偏简单了。自己在队里是挑DP的,要好好搞。。。
PS:这里要打表
#include <bits/stdc++.h>using namespace std;typedef long long LL;const int mod=1e9+7;const int N=1e3+10;LL dp[N][N];int main(){ LL n,k; memset(dp,0,sizeof(dp)); for(int i=0;i<=1000;i++) dp[i][0]=1; for(LL i=1;i<=1000;i++) { for(LL j=1;j<=i;j++) dp[i][j]=(dp[i-1][j-1]*(i-j)%mod+dp[i-1][j]*(j+1)%mod)%mod; } while(~scanf("%lld%lld",&n,&k)) printf("%lld\n",dp[n][k]); return 0;}
0 0
- hdoj3664【DP】
- dp
- dp
- dp
- 【DP】
- dp
- dp
- DP
- DP
- DP
- DP
- DP
- dp
- DP
- dp
- DP
- DP
- dp
- JDK安装及Java环境变量配置
- SQL Join的一些总结
- iOS基础2
- josn 404 405 415
- 专业测评:iphone7致命缺陷曝光
- hdoj3664【DP】
- 友盟分享bug整理
- 【给将来学神的算法详解--高精】(4)对消与还原
- ROS Learning-022 learning_tf-06(编程) 现在与过去中穿梭 (Python版) --- waitForTransformFull() 函数
- JNI开发第二篇通过反射实现C中调用java代码,并实现Log打印日志
- Struts2中的拦截器
- 51单片机定时控制灯
- 记录一个网站
- JAVA基础6.44——单例设计模式