URAL 1658. Sum of Digits(DP)

题目链接

隔了一年零三个月,重新刷URAL,这题挺麻烦的输出路径。输出路径挺扯的,乱写了写乱改改就A了。。。我本来想用很靠谱,记录每一条路径的,然后输出最小的,结果Tle,然后我使劲水水又过了一组,发现别人的题解。。直接来了一次 就过了。。我乱搞了搞,倒着记录最小的,然后倒着输出,就过了。。。

 1 #include <cstring>

 2 #include <cstdio>

 3 #include <string>

 4 #include <iostream>

 5 #include <algorithm>

 6 #include <vector>

 7 #include <queue>

 8 using namespace std;

 9 #define INF 10000000

10 int dp[901][8101];

11 int pre[901][8101];

12 int s[1010];

13 struct node

14 {

15     int a,b;

16 };

17 void spfa()

18 {

19     int i,a,b;

20     queue<node> que;

21     node temp,u,v;

22     for(i = 1; i < 10; i ++)

23     {

24         temp.a = i;

25         temp.b = i*i;

26         dp[i][i*i] = 1;

27         pre[i][i*i] = i;

28         que.push(temp);

29     }

30     while(!que.empty())

31     {

32         u = que.front();

33         a = u.a;

34         b = u.b;

35         que.pop();

36         if(a > 900) continue;

37         if(b > 8100) continue;

38         for(i = 1; i < 10; i ++)

39         {

40             v.a = i+a;

41             v.b = i*i+b;

42             if(i + a > 900) continue;

43             if(i*i + b > 8100) continue;

44             if(dp[v.a][v.b] > dp[u.a][u.b] + 1)

45             {

46                 pre[v.a][v.b] = i;

47                 dp[v.a][v.b] = dp[u.a][u.b] + 1;

48                 que.push(v);

49             }

50         }

51     }

52     return ;

53 }

54 

55 int main()

56 {

57     int t,n,m,i,j;

58     int top;

59     for(i = 1; i <= 900; i ++)

60     {

61         for(j = 1; j <= 8100; j ++)

62         {

63             dp[i][j] = INF;

64             pre[i][j] = INF;

65         }

66     }

67     spfa();

68     scanf("%d",&t);

69     top = 0;

70     while(t--)

71     {

72         scanf("%d%d",&n,&m);

73         if(n > 900||m > 8100)

74         {

75             printf("No solution\n");

76             continue;

77         }

78         else if(dp[n][m] > 100)

79         {

80             printf("No solution\n");

81             continue;

82         }

83         int top = 0;

84         while(n&&m)

85         {

86             i = pre[n][m];

87             s[top++] = i;

88             n = n - i;

89             m = m - i*i;

90         }

91         for(i = top-1;i >= 0;i --)

92         printf("%d",s[i]);

93         printf("\n");

94     }

95     return 0;

96 }

 

你可能感兴趣的:(git)