Codeforces Round #198 (Div. 1) B,C 动态规划
比赛时,开了大号去做,算了半天发现不会做A,囧。于是跑去看B,发现很水?于是很快敲完了,但是A不会,没敢交。于是去看C,一直找规律啊,后来总算调了出来,看了一下榜,发现还是算了吧,直接去睡觉了。第二天一起床把代码一交,居然A了,发现交的话rating还能涨一点,囧。
B:其实就是求一个最长不下降子序列的长度。注意到数据范围,使用二分的方式求解。
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;typedef long long ll;
typedef unsigned long long ull;#define debug puts("here")
#define rep(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define foreach(i,vec) for(unsigned i=0;i<vec.size();i++)
#define pb push_back
#define RD(n) scanf("%d",&n)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)
#define All(vec) vec.begin(),vec.end()
#define MP make_pair
#define PII pair<int,int>
#define PQ priority_queue
#define cmax(x,y) x = max(x,y)
#define cmin(x,y) x = min(x,y)
#define Clear(x) memset(x,0,sizeof(x))
/*#pragma comment(linker, "/STACK:1024000000,1024000000")int size = 256 << 20; // 256MB
char *p = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p) );*//******** program ********************/const int MAXN = 100005;int a[MAXN];
int dp[MAXN];
int q[MAXN];
int n;void cc(){int top = 0;rep1(i,n){if(top==0||dp[top]<a[i]){dp[++top] = a[i];continue;}int l = 1 , r = top;int ans = 1;while(l<=r){int mid = (l+r)>>1;if(dp[mid]<a[i])l = mid+1;else{ans = mid;r = mid-1;}}dp[ans] = a[i];}cout<<top<<endl;
}int main(){#ifndef ONLINE_JUDGEfreopen("sum.in","r",stdin);//freopen("sum.out","w",stdout);
#endifwhile(cin>>n){rep1(i,n)RD(a[i]);cc();}return 0;
}
C:注意变与不变的部分。
假设现在有位置:1,2,3,4,5,6
需要填入的数为:1,2,3,4,7,8
则可以分成两个部分:右边的可以匹配任意位置。
位置:1,2,3,4 5,6
数: 1,2,3,4 7,8
1.当左边的数1匹配上左边时,不妨假设1-2,则左边消除了两个,右边增加一个:数2可以匹配其他的所有位置
2.当左边的数1匹配上右边时,不妨假设1-5,则左边消除了一个,右边数目不变(消除了5,添加了1)
3.当右边的数7匹配上左边时,不妨假设7-1,则左边消除了一个,右边数目不变(消除了7,添加了1)
4.当右边的数7匹配上右边时,不妨假设7-5,则左边不变,右边数目减少一个
所以可以dp,dp[i][j]表示左边有i个,右边有j个时的方案数。
1.当i=0时,为p[j](p[j]表示j的排列)
2.当i=1时,左边任意匹配右边一位,右边数目不变,因此方案数为为p[j]*j。
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;typedef long long ll;
typedef unsigned long long ull;#define debug puts("here")
#define rep(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define foreach(i,vec) for(unsigned i=0;i<vec.size();i++)
#define pb push_back
#define RD(n) scanf("%d",&n)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)
#define All(vec) vec.begin(),vec.end()
#define MP make_pair
#define PII pair<int,int>
#define PQ priority_queue
#define cmax(x,y) x = max(x,y)
#define cmin(x,y) x = min(x,y)
#define Clear(x) memset(x,0,sizeof(x))
/*#pragma comment(linker, "/STACK:1024000000,1024000000")int size = 256 << 20; // 256MB
char *p = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p) );*//******** program ********************/const int MAXN = 2005;
const int MOD = 1e9+7;ll dp[MAXN][MAXN];
int a[MAXN],n;
bool use[MAXN];
ll p[MAXN];ll dfs(int x,int y,int res){if(res<=0) return p[y];if(x==1)return p[y]*y%MOD;if(x==0)return p[y];if(~dp[x][y])return dp[x][y];ll tmp = (x-1);tmp *= dfs(x-2,y+1,res-2);tmp += dfs(x-1,y,res-1)*y;return dp[x][y] = tmp%MOD;
}int main(){#ifndef ONLINE_JUDGEfreopen("sum.in","r",stdin);//freopen("sum.out","w",stdout);
#endifp[0] = p[1] = 1;for(int i=2;i<MAXN;i++)p[i] = p[i-1]*i%MOD;while(cin>>n){Clear(use);rep1(i,n){RD(a[i]);if(~a[i])use[ a[i] ] = true;}int x = 0 , y = 0;rep1(i,n){if(a[i]==-1){if(use[i])y ++;else x ++;}}memset(dp,-1,sizeof(dp));cout<<dfs(x,y,x+y)<<endl;}return 0;
}
转载于:https://www.cnblogs.com/yejinru/p/3293423.html
Codeforces Round #198 (Div. 1) B,C 动态规划相关推荐
- Codeforces Round #198 (Div. 2)A,B题解
Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...
- Codeforces Round #186 (Div. 2) Problem D 动态规划
题意:一条路上有n(n<=300)个洞,m(m<=100000)个公司,第i个公司可以修复连续区间 Li - Ri 内的洞,花费为Vi.问至少修复k个洞,最小花费是多少? 分析:先处理出一 ...
- Codeforces Round #501 (Div. 3) F(动态规划)
大致题意: 给定一个数 n n n与一个字符串s" role="presentation" style="position: relative;"&g ...
- Codeforces Round #697 (Div. 3)A~G解题报告
Codeforces Round #697 (Div. 3)A~G解题报告 题 A Odd Divisor 题目介绍 解题思路 乍一想本题,感觉有点迷迷糊糊,但是证难则反,直接考虑没有奇数因子的情况, ...
- Codeforces Round #620 (Div. 2)(D. Shortest and Longest LIS)(O(n log n)的最长上升子序列或者贪心)
Codeforces Round #620 (Div. 2)(D. Shortest and Longest LIS)(O(n log n)的最长上升子序列或者贪心) time limit per t ...
- Codeforces Round #506 (Div. 3)
Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...
- Codeforces Round #563 (Div. 2)/CF1174
Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...
- 构造 Codeforces Round #302 (Div. 2) B Sea and Islands
题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...
- Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...
最新文章
- tc溜溜865手机投屏卡_游戏物理外挂再升级!腾讯黑鲨游戏手机3S开箱体验
- 多行字符串,带有多余的空格(保留缩进)
- 实现picturecontrol控件显示图片_陕西曝光机触摸屏实时数据控件
- ARM处理器中“8位位图”
- java 时间工具类 大于_Java 时间工具类
- php下载页下载隐藏真实文件地址,php如何隐藏实际文件下载地址
- 剧集《赘婿》向流媒体平台Watcha授出翻拍权
- Spring Boot 学习系列(01)—从0到1,只需两分钟
- scipy 常用函数(special, spatial.distance, integrate)
- Money----思维+模拟
- Atitit.code base view 视图的实现原理
- IEEE论文格式要求(翻译)
- scratch优秀案例-双人足球对战赛
- 微信JS-SDK的PHP demo页面,解决Internal error 500错误
- MySQL 插入语句
- 带隙基准(BG)的基本原理与结构
- 小韩详解 Iptables -- 简单使用
- springboot单文件下载和多文件压缩zip下载
- 陶瓷电容,钽电容,铝电解电容对比
- Python经典好书从入门到进阶整理好送你
热门文章
- Agent编程平台的实现
- liunx下NetworkManager导致网卡不能启动
- MFC编译出来的程序不能在其他机器上用
- 国产手机可以复制苹果的成功吗?
- lucene学习之helloworld(简单实例)
- java invocationtarget,Java异常处理之java.lang.reflect.InvocationTargetException
- bash:附近有语法错误_Bash备忘单:按键组合和特殊语法
- devops 工具_衡量DevOps成功的13种工具
- linux 一切都是文件_一切都是文件
- grass gis怎么使用_使用GRASS GIS返回学校