zoukankan      html  css  js  c++  java
  • POJ 1239 Increasing Sequences [DP]

    题意:略。

    思路:进行两次dp。

    第一次dp从前向后,用dp[x]表示从第x位向前dp[x]位可构成一个数字,且与前面的数组符合题意要求。最后求的dp[n]即为最后一个数字的长度。

    而题目还有要求,所有解中输出前面数字最大的一个。因此还需要进行一次dp,从后向前。

    具体看代码吧,当初也是看别人代码才看懂的。

     1 #include<stdio.h>
     2 #include<string.h>
     3 char num[85];
     4 int dp[85], n;
     5 bool judge(int st1,int len1,int st2,int len2)
     6 {
     7     while (num[st1] == '0' && len1) st1++, len1--;
     8     while (num[st2] == '0' && len2) st2++, len2--;
     9     if (len1 < len2) return 1;
    10     else if (len1 > len2) return 0;
    11     else
    12     {
    13         for (int i = 0; i < len1; i++)
    14         {
    15             if (num[st1+i] < num[st2+i]) return 1;
    16             if (num[st1+i] > num[st2+i]) return 0;
    17         }
    18     }
    19     return 0;
    20 }
    21 void print(int pos)
    22 {
    23     if (pos > n) return;
    24     if (pos != 1) printf(",");
    25     for (int i = pos; i < pos + dp[pos]; i++)
    26         printf("%c", num[i]);
    27     print(pos + dp[pos]);
    28 }
    29 int main()
    30 {
    31     while (~scanf("%s", num + 1) && strcmp(num + 1, "0"))
    32     {
    33         n = strlen(num + 1);
    34         dp[1] = 1;
    35         for (int i = 2; i <= n; i++)
    36         {
    37             dp[i] = i;
    38             for (int j = i - 1; j >= 1; j--)
    39                 if (judge(j - dp[j] + 1, dp[j], j + 1, i - j))
    40                 {
    41                     dp[i] = i - j;
    42                     break;
    43                 }
    44         }
    45         int pos = n - dp[n] + 1;
    46         dp[pos] = dp[n];
    47         for (int i = pos - 1; i >= 1; i--)
    48         {
    49             if (num[i] == '0')
    50             {
    51                 dp[i] = dp[i+1] + 1;
    52                 continue;
    53             }
    54             for (int j = pos; j > i; j--)
    55                 if (judge(i, j - i, j, dp[j]))
    56                 {
    57                     dp[i] = j - i;
    58                     break;
    59                 }
    60         }
    61         print(1);
    62         printf("
    ");
    63     }
    64     return 0;
    65 }
  • 相关阅读:
    最短路径算法floyd(转)
    Effective Java 笔记(超链接)
    最短路径算法Dijkstra (转)
    散列表(哈希表)工作原理 (转)
    Java标记接口
    java clone方法使用详解(转)
    Effective Java笔记 (转)
    KMP算法中next数组的理解与算法的实现(java语言)
    sqlserver行列调换
    Linq的一些用法
  • 原文地址:https://www.cnblogs.com/fenshen371/p/3317638.html
Copyright © 2011-2022 走看看