1 条题解

  • 2
    @ 2024-6-12 18:58:37

    本题是图上的动态规划,是一道比较模版的题目。

    思路:首先按题目读入,顺便统计入度。然后将入度为 0 的点放入队列,进行拓扑排序。再对每条边进行动态规划,最后求最大值就行了。

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 100010;
    int n,m;
    int a[N],d[N];
    int f[N][15];
    queue<int> q; 
    vector<int> g[N];
    int main(){
    	cin>>n>>m;
    	for(int i = 1;i <= n;i++) cin>>a[i];//读入 
    	for(int i = 1,u,v;i <= m;i++){
    		cin>>u>>v;
    		g[u].push_back(v);//建边 
    		d[v]++;//统计入度 
    	}
    	for(int i = 1;i <= n;i++){//拓扑排序初始化 
    		if(!d[i]){
    			q.push(i);
    			f[i][a[i]] = true;
    		}
    	}
    	while(!q.empty()){
    		int u = q.front(); q.pop();
    		for(auto i : g[u]){//dp
    			for(int j = 1;j <= 10;j++) 
    				f[i][j] = max(f[i][j],f[u][j]);
    			d[i]--;
    			if(!d[i]){
    				for(int k = a[i];k >= 1;k--) 
    					f[i][a[i]] = max(f[i][a[i]],f[i][k] + 1); 
    				q.push(i);
    			}
    		}
    	}
    	int ans = 1;
    	for(int i = 1;i <= n;i++){
    		for(int j = 1;j <= 10;j++) 
    			ans = max(ans,f[i][j]);//求最大值 
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    
    • 1

    [GESP样题 七级] 最长不下降子序列

    信息

    ID
    655
    时间
    1000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    11
    已通过
    8
    上传者