比赛时,开了大号去做,算了半天发现不会做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 动态规划相关推荐

  1. Codeforces Round #198 (Div. 2)A,B题解

    Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...

  2. Codeforces Round #186 (Div. 2) Problem D 动态规划

    题意:一条路上有n(n<=300)个洞,m(m<=100000)个公司,第i个公司可以修复连续区间 Li - Ri 内的洞,花费为Vi.问至少修复k个洞,最小花费是多少? 分析:先处理出一 ...

  3. Codeforces Round #501 (Div. 3) F(动态规划)

    大致题意: 给定一个数 n n n与一个字符串s" role="presentation" style="position: relative;"&g ...

  4. Codeforces Round #697 (Div. 3)A~G解题报告

    Codeforces Round #697 (Div. 3)A~G解题报告 题 A Odd Divisor 题目介绍 解题思路 乍一想本题,感觉有点迷迷糊糊,但是证难则反,直接考虑没有奇数因子的情况, ...

  5. 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 ...

  6. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  7. 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 ...

  8. 构造 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 的例子可以 ...

  9. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

最新文章

  1. tc溜溜865手机投屏卡_游戏物理外挂再升级!腾讯黑鲨游戏手机3S开箱体验
  2. 多行字符串,带有多余的空格(保留缩进)
  3. 实现picturecontrol控件显示图片_陕西曝光机触摸屏实时数据控件
  4. ARM处理器中“8位位图”
  5. java 时间工具类 大于_Java 时间工具类
  6. php下载页下载隐藏真实文件地址,php如何隐藏实际文件下载地址
  7. 剧集《赘婿》向流媒体平台Watcha授出翻拍权
  8. Spring Boot 学习系列(01)—从0到1,只需两分钟
  9. scipy 常用函数(special, spatial.distance, integrate)
  10. Money----思维+模拟
  11. Atitit.code base view 视图的实现原理
  12. IEEE论文格式要求(翻译)
  13. scratch优秀案例-双人足球对战赛
  14. 微信JS-SDK的PHP demo页面,解决Internal error 500错误
  15. MySQL 插入语句
  16. 带隙基准(BG)的基本原理与结构
  17. 小韩详解 Iptables -- 简单使用
  18. springboot单文件下载和多文件压缩zip下载
  19. 陶瓷电容,钽电容,铝电解电容对比
  20. Python经典好书从入门到进阶整理好送你

热门文章

  1. Agent编程平台的实现
  2. liunx下NetworkManager导致网卡不能启动
  3. MFC编译出来的程序不能在其他机器上用
  4. 国产手机可以复制苹果的成功吗?
  5. lucene学习之helloworld(简单实例)
  6. java invocationtarget,Java异常处理之java.lang.reflect.InvocationTargetException
  7. bash:附近有语法错误_Bash备忘单:按键组合和特殊语法
  8. devops 工具_衡量DevOps成功的13种工具
  9. linux 一切都是文件_一切都是文件
  10. grass gis怎么使用_使用GRASS GIS返回学校