200718-省选模拟2

省选模拟2

T1

题目描述

题目描述

题解

咕咕咕

T2

题目描述

题目描述

题解

咕咕咕

T3

题目描述

题解

由于具有一一对应的关系,所以将图转换为序列。
1,独立集
对应在序列中, 一定是上升子序列
2,覆盖集
对应在序列中,那么没被选择在覆盖集中的点一定与覆盖集中至少一个点连有边。那么该点要么比前面选择的点小,要么比后面选择的点大

于是考虑dp解决,类似于求最长上升子序列,不过转移要满足两个条件
在这里插入图片描述

代码

#include<bits/stdc++.h>
#define M 1009
using namespace std;
const int mod=1e9+7;
int read(){
	int f=1,re=0;char ch;
	for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
	if(ch=='-'){f=-1,ch=getchar();}
	for(;isdigit(ch);ch=getchar()) re=(re<<3)+(re<<1)+ch-'0';
	return re*f;
}
int n,m,num[M],f[M];
bool bj[1009][1009];
signed main(){
	//freopen("senritsu.in","r",stdin);
	//freopen("senritsu.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=m;i++){
		int x=read(),y=read();
		if(x>y) swap(x,y);
		bj[x][y]=1;
		num[x]++;
	}
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
			if(!bj[i][j]) num[j]++;
//	for(int i=1;i<=n;i++) printf("%d ",num[i]);
//	printf("\n");
	num[0]=-1,f[0]=1;
	num[n+1]=n+1;
	for(int i=1;i<=n+1;i++){
		int maxn=-2;
		for(int j=i-1;j>=0;j--){
			if(num[j]>maxn&&num[j]<num[i]) f[i]=(f[i]+f[j])%mod;
			if(num[j]<num[i]) maxn=max(maxn,num[j]); 
		}
	}
//	for(int i=1;i<=n;i++) printf("%d ",f[i]);
//	printf("\n");
	printf("%d\n",f[n+1]%mod);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值