动态规划解决航线设置问题

来源:互联网 发布:mp3播放器推荐 知乎 编辑:程序博客网 时间:2024/06/10 09:00
 
#include <iostream>using namespace std;int main(){/*海滨城市两边分布着N个城市,两边城市唯一对应自己的友好城市,并且只有友好城市才可以设置航线。 要求航线不可以相交,求可以设置的最多航线数。 例如:A: 1 2 3 4    (A 的友好城市为 B)       B: 2 4 1 3 此例子最多可以设置 2 条航线。 动态规划解决,可以求最大不降序列来完成。 a[i] 表示城市 i 对应的友好城市编号。 m[i] 表示城市 i 如果设置航线,则可以设置的最大航线数为 m[i] 。 next[i] 表示城市 i 如果设置航线,则其值为下一个可以设置航线的城市。*/freopen("in.txt", "r", stdin);int n, i, j, k;int a[100];int m[100];int next[100];memset(next, 0, 100*4);for(i = 1; i < 100; i++) // m[] 初始化为 1 ,因为至少可以设置一条航线。 m[i] = 1;cin>>n;for(i = 1; i <= n; i++){cin>>j;cin>>a[j];}int max = 0;for(i = n-1; i >= 1; i--) // 从倒数第二个城市开始{for(j = i+1; j <= n; j++) //  i+1 ... n{   if( a[i] < a[j] && max < m[j] ) // 可以设置航线   {   max = m[j]; // 保存最大的航线数   next[i] = j; // 保存下一个可以设置航线的城市   }}m[i] = max + 1; // 最大的航线数加一,如果么有满足条件的,max 的值为 0 ,不影响 m[i]max = 0; // max 复位}max = m[1];for(i = 1; i <= n; i++) // 找出最大的{if( max < m[i] )max = m[i];}cout<<max<<endl;return 0;}

原创粉丝点击