牛客网在线编程_特征提取

题目地址

题目大意是给n个帧,每个帧有m个特征,特征用一个二元组表示,求在连续的帧中出现的特征的连续出现次数

  • 第一反应想了一个很麻烦的做法,没想到别人的代码直接用map冲过去的。
  • 二元组用个pair或者hash一下然后用map离散化,然后反过来转化为每个特征对应出现的帧的下标值,得到这样一个邻接表,然后对于每个特征,就是要求出对应vector数组里最长连续加1上升子序列长度,简单的dp一下。
  • 多组样例最好用queue记录一下用过的dp值再清空,不过似乎数据特别水...
  • 别人的做法大多是直接维护两个map,记录特征连续出现的次数,然后扫一遍即可。

  • code1
#include 
using namespace std;
const int N=1e5+50;
int T,n,m,x,y;
map,int> mp;
vector g[N];
int dp[N];
queue q;
int main(){
    scanf("%d",&T);
    while(T--){
        int cnt=1;
        mp.clear();
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&m);
            for(int j=1;j<=m;j++){
                scanf("%d%d",&x,&y);
                if(mp.find({x,y})==mp.end()){
                    mp[{x,y}]=cnt++;
                }
                g[mp[{x,y}]].push_back(i);
            }
        }
        int ans=0;
        for(int i=1;i
  • code2
#include 
using namespace std;
int T,n,m,x,y;
map,int> pre,now;
int main(){
    scanf("%d",&T);
    while(T--){
        pre.clear();
        now.clear();
        scanf("%d",&n);
        int ans=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&m);
            for(int j=1;j<=m;j++){
                scanf("%d%d",&x,&y);
                if(pre.find({x,y})==pre.end()){
                    now[{x,y}]=1;
                }else{
                    now[{x,y}]=pre[{x,y}]+1;
                }
                ans=max(ans,now[{x,y}]);
            }
            pre=now;
            now.clear();
        }
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(牛客网在线编程_特征提取)