Κοινή χρήση τεχνολογίας

Touge Resource Library (24) Εισαγάγετε το σύμβολο συν

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Περιγραφή προβλήματος

2. Αλγοριθμικές Σκέψεις  

Για την επίλυση αυτού του προβλήματος μπορεί να χρησιμοποιηθεί δυναμικός προγραμματισμός.

Αρχικά, χωρίστε τη συμβολοσειρά αριθμών σε πολλούς αριθμούς και χρησιμοποιήστε έναν πίνακα αριθμών για να αποθηκεύσετε κάθε αριθμό. Για παράδειγμα, η συμβολοσειρά αριθμών 79846 θα χωριστεί στον πίνακα [7, 9, 8, 4, 6].

Στη συνέχεια, ορίστε έναν δισδιάστατο πίνακα dp, όπου το dp[i][j] αντιπροσωπεύει την ελάχιστη τιμή που μπορεί να ληφθεί εισάγοντας σύμβολα j συν στους πρώτους αριθμούς i. Αρχικοποιήστε τον πίνακα dp στο άπειρο, εκτός από το dp[0][0] = 0.

Στη συνέχεια, χρησιμοποιήστε δύο βρόχους για να ενημερώσετε τον πίνακα dp. Ο εξωτερικός βρόχος διασχίζει κάθε αριθμό στη συμβολοσειρά αριθμών και ο εσωτερικός βρόχος διασχίζει τον αριθμό των εισαγόμενων συμβόλων συν. Για κάθε dp[i][j], μπορείτε να εξετάσετε το ενδεχόμενο να συνδυάσετε τον αριθμό nums[i] με τον προηγούμενο αριθμό για να σχηματίσετε έναν νέο αριθμό ή να εισαγάγετε ένα σύμβολο συν μεταξύ του αριθμού nums[i] και του προηγούμενου αριθμού. Πάρτε τη μικρότερη τιμή των δύο καταστάσεων ως τιμή του dp[i][j].

Τέλος, η ελάχιστη τιμή στην τελευταία σειρά του πίνακα dp είναι η ελάχιστη τιμή που αναζητείται.

3. Εφαρμογή κώδικα  

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <limits.h>
  4. #include <stdlib.h>
  5. // Helper function to extract integer value from substring
  6. int getNumber(char* str, int start, int end) {
  7. char buffer[12]; // Buffer large enough for max 10 digits + '0'
  8. int length = end - start + 1;
  9. strncpy(buffer, str + start, length);
  10. buffer[length] = '0';
  11. return atoi(buffer);
  12. }
  13. int main() {
  14. char str[201];
  15. int M;
  16. scanf("%s %d", str, &M);
  17. int n = strlen(str);
  18. int dp[n+1][M+1];
  19. // Initialize dp array with large numbers
  20. for (int i = 0; i <= n; i++) {
  21. for (int j = 0; j <= M; j++) {
  22. dp[i][j] = INT_MAX;
  23. }
  24. }
  25. // Base case: no splits
  26. dp[0][0] = 0;
  27. // Dynamic programming to calculate minimum sum
  28. for (int i = 1; i <= n; i++) {
  29. for (int j = 0; j <= M; j++) { // j can be 0 as well
  30. if (j == 0) {
  31. dp[i][j] = getNumber(str, 0, i-1);
  32. } else {
  33. for (int k = 1; k < i; k++) { // k starts from 1
  34. if (dp[k][j-1] != INT_MAX) {
  35. int num = getNumber(str, k, i-1);
  36. if (dp[k][j-1] + num < dp[i][j]) {
  37. dp[i][j] = dp[k][j-1] + num;
  38. }
  39. }
  40. }
  41. }
  42. }
  43. }
  44. // Find the minimum value in dp[n][*] with M splits
  45. int result = INT_MAX;
  46. for (int i = 0; i <= M; i++) {
  47. if (dp[n][i] < result) {
  48. result = dp[n][i];
  49. }
  50. }
  51. printf("%dn", result);
  52. return 0;
  53. }

Αποτελέσματα του

 συμπέρασμα       

επιθυμία να αυξηθεί ο ενθουσιασμός

Η επιμονή μπορεί να λειάνει τα βουνά

!!!