Technology sharing

Touge Resource Library (24) Insert plus signum

2024-07-12

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

1. Problem descriptionem

2. Cogitata Algorithmica  

Programmatio dynamica adhiberi potest ad hanc quaestionem solvendam.

Primum, chorda numerum in numerosos divide, et numeros ordinatos utere ad quemlibet numerum congregem. Verbi gratia, numerus chordae 79846 fisus erit in ordinata [7, 9, 8, 4, 6].

Deinde definias duo dimensiva ordinata dp, ubi dp[i][j] valorem minimum, qui obtineri potest, inserendo j plus signa in primum i numeros. Initialize dp ordinata in infinitum, excepto dp[0][0] = 0 .

Tum utere binis ansulis ad dp ordinatam update. Ansa exterior quemque numerum in chorda percurrit, et ansa interior numerum additorum plus signorum percurrit. Utraque enim dp[i][j] considerare potes numerum nums[i] cum priore coniungendo ad novum numerum formandum, vel addito plus signo inter numerum nums[i] et numerum priorem. Minorem valorem duarum condicionum ut valor dp[i][j] adhibe.

Denique minimi pretii in ultimo ordine instrumenti dp ordinati minimi valoris quaesitus est.

3. Code implementation  

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

Proventus of the

 conclusio       

studium augere cupio

Perseverantia potest lenire montes

!!!