Partage de technologie

Bibliothèque de ressources Touge (24) Insérer le signe plus

2024-07-12

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

1. Description du problème

2. Pensées algorithmiques  

La programmation dynamique peut être utilisée pour résoudre ce problème.

Tout d’abord, divisez la chaîne numérique en plusieurs nombres et utilisez un tableau nums pour stocker chaque nombre. Par exemple, la chaîne numérique 79846 sera divisée en tableau [7, 9, 8, 4, 6].

Définissez ensuite un tableau bidimensionnel dp, où dp[i][j] représente la valeur minimale pouvant être obtenue en insérant j signes plus dans les i premiers nombres. Initialisez le tableau dp à l'infini, sauf pour dp[0][0] = 0.

Utilisez ensuite deux boucles pour mettre à jour le tableau dp. La boucle externe parcourt chaque nombre de la chaîne numérique et la boucle interne parcourt le nombre de signes plus insérés. Pour chaque dp[i][j], vous pouvez envisager de combiner le nombre nums[i] avec le nombre précédent pour former un nouveau nombre, ou d'insérer un signe plus entre le nombre nums[i] et le nombre précédent. Prenez la plus petite valeur des deux situations comme valeur de dp[i][j].

Enfin, la valeur minimale de la dernière ligne du tableau dp est la valeur minimale recherchée.

3. Mise en œuvre du code  

  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. }

Résultats du

 Conclusion       

désir d'augmenter l'enthousiasme

La persévérance peut aplanir les montagnes

!!!