动态规划——最长非递增子序列问题(导弹拦截)

103 阅读1分钟
void IncreaseOrder(int a[], int n)
{
    int i, j, k, index;
    int L[10];              //存储最长非递增子序列的长度
    int x[10][10];          //存储对应的最长非递增子序列
    for (i = 0; i < n; i++) //初始化,最长非递增子序列长度为1
    {
        L[i] = 1;
        x[i][0] = a[i];
    }
    for (i = 1; i < n; i++)
    {
        int max = 1;
        for (j = i - 1; j >= 0; j--) //寻找某个数之前,看能否找到非递增序列
        {
            if ((a[j] > a[i]) && (max < L[j] + 1)) //满足非递增条件且长度小于之前的序列长度
            {
                max = L[j] + 1;
                L[i] = max;                   //储存最大长度
                for (k = 0; k < max - 1; k++) //储存最长非递增子序列
                {
                    x[i][k] = x[j][k];
                }
                x[i][max - 1] = a[i];
            }
        }
    }
    for (index = 0, i = 1; i < n; i++) //求所有导弹非递增子序列的最大长度
    {
        if (L[index] < L[i])
            index = i;
    }
    cout << endl << "最多能拦截的导弹个数:" << L[index] << endl; //输出最大长度
    cout << "各拦截的导弹高度:";
    for (i = 0; i < L[index]; i++) //输出最长非递增子序列
        cout << x[index][i] << "  ";
}
int main()
{
    for (i = 0; i < n; i++) ///输入来袭的导弹飞行高度
        cin >> a[i];
    IncreaseOrder(a, n); //调用函数求解
}