• 动态规划(dp)专题


    航线设置          

    问题描述
    在美丽的莱茵河畔,每边都分布着N个城市,两边的城市都是唯一对应的友好城市,现需要在友好城市间开通航线以加强往来,但因为莱茵河常年大雾,如果开设的航线发生交叉就有可能出现碰船的现象。现在要求尽可能多地开通航线并且使航线不能相交。
    输入
    有若干组测试数据,每组测试数据的第一行是一个整数n,它表示每边都分布着n个城市(1<=n<=1000)。接着有n行,每一行有2个整数s,t,之间有一个空格,s表示起点城市,t表示终点城市。
    输出
    对每组测试数据,首先在一行上输出“Case #:”,其中“#”为测试数据组号,从1开始编号。接着在下一行输出“The Maximal number is:”,紧跟着输出这些城市间不相交的最大的航线数。
    输入样例:
    4
    1 2
    2 4
    3 1
    4 3
     
    输出样例:
    Case 1:
    The Maximal number is:2
    思路:数据结构:a[s]=t;//表示s开往t
    状态:d[i]:=以第a[i]个城市为结尾的最大航线数;
    状态转移方程:d[i]={d[i],d[j]+1|j<i且a[j]<a[i]}
    则结果为最大的d[i];
     
    代码:
    #include <bits/stdc++.h>
    
    using namespace std;
    
     
    
    const int maxn=1001;
    
    int a[maxn],d[maxn];
    
    int n,ans,s,t; 
    
     
    
    int main()
    
    {
    
        while (scanf("%d",&n)) 
    
        {
    
            for (int i = 1; i <= n; i++) 
    
            {
    
                scanf("%d%d",&s,&t);
    
                a[s]=t;
    
            }
    
            ans=0;
    
            for(int i=1;i<=n;i++)
    
            {
    
                d[i]=1;
    
                for(int j=1;j<i;j++)
    
                    if(a[j]<a[i])//核心判断
    
                        d[i]=max(d[i],d[j]+1);
    
                ans=max(ans,d[i]);
    
            }
    
            printf("%d
    ",ans);
    
        }
    
        return 0;
    
    }

    游船费问题

    https://wenku.baidu.com/view/31ab1d2f3169a4517723a3fd.html

  • 相关阅读:
    数据库面试题
    网络编程_TCP协议_客户端与服务端
    29-街道最短路径问题(哈曼顿距离)
    60-安慰奶牛(最小生成树)
    20-集合问题(并查集)
    59-算法训练 操作格子 (线段树)
    58-最小乘积(基本型)
    11-vector的使用
    20-取石子动态规则(hdu2516 斐波那契博弈)
    19-格子游戏(hdu2147博弈)
  • 原文地址:https://www.cnblogs.com/unknownname/p/10072522.html
Copyright © 2020-2023  润新知