糟糕的打谱员

  • 比赛主页
  • 我的提交

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

众所周知,围棋是一项黑白双方轮流行动的棋类游戏。在围棋中,还有打劫的概念,若一方落子在某一个劫争处,则另一方不能立刻也下在这个劫争处,而之后还是可以下的。现在,你是一场史诗级围棋对弈(史诗级体现在这场棋每一步都下在了劫争上)的记谱员,但熬夜到早上七点才睡的你状态不佳,胡乱记了许多东西。

为了假装你有出色的完成记谱工作,请从你记录的谱子中找到一个最长的合法行棋子序列。

一个合法行棋子序列需要满足:

1. 任意相邻的两步,玩家不同(一黑一白);

2. 任意相邻的两步,不能下在同一个劫争处。

子序列是指原序列中删除若干(可以不删)元素得到的新序列。

输入描述:

第一行是整数T(1≤T≤10)T(1≤T≤10),测试组数。每组测试用例,第一行是整数n(3≤n≤105)n(3≤n≤105),你记录的谱子长度。接下来nn行,每行两个数ci(0≤ci≤1)ci​(0≤ci​≤1)和ai(1≤ai≤10)ai​(1≤ai​≤10),表示一步棋,下这步棋的人是cici​且下在了编号为aiai​的劫争处。

输出描述:

每个测试用例输出一个整数,表示最长的合法行棋子序列长度。

示例1

输入

复制

1
20
1 10
0 6
0 9
1 3
0 3
0 5
0 3
1 1
0 2
0 2
0 2
1 9
1 10
1 1
1 10
0 6
0 8
1 1
1 9
0 1

输出

复制

10
/*
*@Author:   GuoJinlong
*@Language: C++
*/
//#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>
using namespace std;
const int mod=1e9+7;
typedef long long  ll;
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r)/2
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int MAXN = 305;
const int INF = 0x3f3f3f3f;
const int N=5e4+7;
const int maxn=1e5+5;
const double EPS=1e-10;
const double Pi=3.1415926535897;
//inline double max(double a,double b){
//    return a>b?a:b;
//}
//inline double min(double a,double b){
//    return a<b?a:b;
//}int xd[8] = {0, 1, 0, -1, 1, 1, -1, -1};
int yd[8] = {1, 0, -1, 0, -1, 1, -1, 1};//void Fire(){
//    queue<node> p;
//    p.push({fx,fy,0});
//    memset(fire, -1, sizeof(fire));
//    fire[fx][fy]=0;
//    while(!p.empty()){
//        node temp=p.front();
//        p.pop();
//        for(int i=0;i<8;i++){
//            int x=temp.x+xd[i];
//            int y=temp.y+yd[i];
//            if(x<0||x>=n||y<0||y>=m||fire[x][y]!=-1){
//                continue;
//            }
//            fire[x][y]=temp.val+1;
//            p.push({x,y,temp.val+1});
//        }
//    }
//}
//int bfs(){
//    queue<node> p;
//    memset(vis, 0, sizeof(vis));
//    p.push({sx,sy,0});
//    while (!p.empty()) {
//        node temp=p.front();
//        vis[temp.x][temp.y]=1;
//        p.pop();
//        for(int i=0;i<4;i++){
//            int x=temp.x+xd[i];
//            int y=temp.y+yd[i];
//            if(x<0||x>=n||y<0||y>=m)  continue;
//            if(x==ex&&y==ey&&temp.val+1<=fire[x][y]) return temp.val+1;
//            if(vis[x][y]||temp.val+1>=fire[x][y]||a[x][y]=='#') continue;
//            p.push({x,y,temp.val+1});
//        }
//    }
//    return -1;
//}//一维哈希
//int n;
//string s;
//int bas=131;
//typedef unsigned long long ull;
//const ull mod1=100001651;
//ull a[100010];
//ull Hash(string s){
//    ll ans=0;
//    for(int i=0;i<s.size();i++){
//        ans*=bas;
//        ans+=int(s[i]);
//        ans%=mod1;
//    }
//    return ans;
//}//二维哈希
//using lom=unsigned long long ;
//const lom bas1=131,bas2=233;
//const int M=505;
//int n,m;
//char a[M][M];
//lom _hash[M][M];
//lom p1[M],p2[M];
//
//
//void init(){
//    p1[0]=1;
//    p2[0]=1;
//    for(int i=1;i<=505;i++){
//        p1[i]=p1[i-1]*bas1;
//        p2[i]=p2[i-1]*bas2;
//
//    }
//}
//void Hash(){
//    _hash[0][0]=_hash[0][1]=_hash[1][0]=0;
//    for(int i=1;i<=n;i++){    //前缀和
//        for(int j=1;j<=m;j++){
//            _hash[i][j]=_hash[i][j-1]*bas1+a[i][j]-'a';
//        }
//    }
//    for(int i=1;i<=n;i++){   //二维前缀和
//        for(int j=1;j<=m;j++){
//            _hash[i][j]+=_hash[i-1][j]*bas2;
//        }
//    }
//
//}int t;
int n,c,a;
int dp[2][11];
int main(){cin>>t;while (t--) {memset(dp, 0, sizeof(dp));cin>>n;int ans=0;for(int i=0;i<n;i++){cin>>c>>a;for(int j=1;j<=10;j++){if(a!=j){dp[c][a]=max(dp[c][a],dp[c^1][j]+1);}}ans=max(ans,dp[c][a]);}cout<<ans<<endl;}}

糟糕的打谱员(dp)相关推荐

  1. [nk] 糟糕的打谱员 线性DP

    前言 线性DP是世界上最难的算法!!(我在口胡) 前言 : https://ac.nowcoder.com/acm/contest/11215/C 思路 看完该题之后 (问的什么鬼 贪心?排序之后交替 ...

  2. 用什么心态对待水平糟糕的程序员[不靠谱的程序员、思路紊乱的程序员]?

    这些年遇到了很多糟糕的程序员,其实真正是写程序料的人,普通IT公司大概只占1/3左右吧,其实有2/3的人都太适合当程序员,还不如早点儿改行该干啥就干啥了,其中有1/10的人往往是相对比较糟糕的. 01 ...

  3. 十个行为把你变成糟糕的程序员

    十个行为把你变成糟糕的程序员 http://developer.51cto.com/art/201107/276255.htm 程序员当然也是分级别的,不是所有的程序员都是一个合格或是优秀的程序员.建 ...

  4. 优秀的程序员VS糟糕的程序员

    优秀的程序员和一般的程序员差别在哪里?怎么才能成为优秀的程序员?我们选择了这个职业就要把他做好! 优秀的程序员: 1.逻辑能力很强,这也是解决问题的关键. 2.分析能力.可以很好的解决复杂问题. 3. ...

  5. 十个让你变成糟糕的程序员的行为

    转载:http://coolshell.cn/articles/1081.html 之前本站发表过<优秀程序员的十个习惯>以及<程序员需要具备的基本技能>,那是我们需要去学习和 ...

  6. 十个糟糕的程序员的行为

    原文:http://cocre.com/?p=1081 之前本站发表过<优秀程序员的十个习惯>以及<程序员需要具备的基本技能>,那是我们需要去学习和培养的.这里,我们主要讨论十 ...

  7. 糟糕的程序员并不愚蠢,只是……

    总有些程序员更为出色.事实上,据某一统计数据显示:他们之中少部分人着实优异,有部分还不错,大多数至少能胜任程序员的工作,而一些人几乎不能胜任,一些则令人敬而远之. 也就是说,优秀的程序员和糟糕的程序员 ...

  8. 如何成为一名糟糕的程序员?

    今天我想和你聊一聊优秀程序员的基本素养. 我想你肯定遇到过这样一类程序员:他们无论是写代码,还是写文档,又或是和别人沟通,都显得特别专业.每次遇到这类人,我都在想,他们到底是怎么做到的? 随着工作时间 ...

  9. “21 天好习惯”第一期-10

    A 牛牛冲钻五 模拟,逐位处理判断前三位即可 #include <bits/stdc++.h> using namespace std; #define rep(i, j, k) for ...

最新文章

  1. UIScrollView点击StatusBar返回顶部失效的解决
  2. loadrunner目录分析
  3. 数据结构:线性数据结构(1)-栈(栈,队列,deques, 列表)
  4. FormsAuthentication 和 Session 超时时间不一的问题
  5. Android之用HttpURLConnection断点下载谷歌云存储(google cloud storage)文件
  6. 为您的下一个基于Spring的应用程序考虑使用spring-boot的原因!
  7. shiro学习(4):shiro认证流程
  8. springboot 项目实战 基本框架搭建(IDEA)
  9. 如何在矩池云内置Jupyter中访问网盘中的文件呢?
  10. jvm 的内存分配方式
  11. 设计模式之GOF23原型模式02
  12. 最新黑马程序员全套视频-.net视频,大家赶紧来下载吧,看图片水印上的QQ加我索取视频教程
  13. 新华三杯考前突击---Day4---综合篇
  14. 生活随记 - 2020国庆第四天
  15. 金九银十,23届秋招信息超全汇总表!各大名企优质岗位持续更新中···
  16. ads1110程序实测好用
  17. Java课程设计学生考勤管理
  18. 计算机java相关英文文献,计算机专业 Java外文翻译 外文文献 英文文献.docx
  19. Feelings on Life
  20. SpringBoot-yaml语法规则和读取数据

热门文章

  1. java学习(一)概述
  2. Python的大数据之旅(1)---Anaconda与WingIDE安装
  3. Oracle 存储过程中自定义异常
  4. mysql中各种类型的锁
  5. 4月计算机网络原理试题,4月全国自考计算机网络原理试题及答案解析.docx
  6. arm鲲鹏服务器和x86区别
  7. 多空博弈主力资金控盘强度指标公式 主/副图
  8. 在python中gevent monkey_patch 出现Monkey-patching may lead to errors解决
  9. Python中常用最神秘的函数! lambda 函数深度总结!
  10. c++ 左值 广义左值 右值 纯右值 将亡值