Rumah > pembangunan bahagian belakang > C++ > Program C untuk laluan kos minimum

Program C untuk laluan kos minimum

王林
Lepaskan: 2023-08-26 18:17:07
ke hadapan
1122 orang telah melayarinya

Program C untuk laluan kos minimum

Di sini kami akan menyelesaikan masalah laluan kos minimum dalam bahasa C. Ini bertujuan untuk dilakukan pada matriks 2D di mana setiap sel mempunyai kos pergerakan. Kita mesti mencari laluan dari sudut kiri atas ke sudut kanan bawah dengan kos perjalanan minimum. Anda hanya boleh melintasi sel ke bawah dan ke kanan dari sel tertentu.

Untuk menyelesaikan masalah khusus ini, pengaturcaraan dinamik adalah lebih baik daripada rekursi.

Memandangkan matriks kos c ost[ ][ ] dan kedudukan (m,n), kita perlu menulis fungsi yang mengembalikan kos laluan minimum dari (0,0) kepada (m,n) kepada (m Jumlah kos laluan, n), ialah jumlah semua kos pada laluan itu (termasuk sumber dan destinasi).

Anggap− bahawa semua kos adalah positif. Tiada kitaran kos negatif dalam matriks input

Contoh

Cari laluan kos minimum ke (2,2)

Program C untuk laluan kos minimum

Kos diberikan dalam imej itu sendiri. Laluan akan menjadi (0, 0) ⇒ (0, 1) ⇒ (1, 2) ⇒ (2, 2). Laluan mempunyai nilai 8 (1 +2+2+ 3).

Kaedah− Mencipta matriks jawapan yang serupa dengan saiz matriks yang diberikan.

Isi matriks ini dengan cara dari bawah ke atas.

Diberikan − arrA[ ][ ]. Dalam setiap sel kita mempunyai 2 pilihan (kanan atau bawah) dan untuk mana-mana sel i,j kita boleh memilih minimum 2 pilihan ini.

solution[i][j]=A[0][j] if i=0, 1st row
   =A[i][0] if j=0, 1st column
=A[i][j]+Min(solution[i=1],[j],solution[i][j-1]) if i>0 && j>0
Salin selepas log masuk

Pendekatan yang diikuti dalam jawapan algoritma boleh menyelesaikan masalah ini dengan cekap dengan menggunakan pengaturcaraan dinamik. Buat jadual laluan kos minimum bersaiz m,n dan tentukan -

minimumCostPath[i][j] = minimum value to achieve (i, j) from (0, 0)
Salin selepas log masuk

Jelas sekali,

minimumCostPath[0][0] = costMatrix[0][0]
minimumCostPath[i][0] = minimumCostPath[i - 1][0] + costMatrix[i][0], for all values of i > zero
minimumCostPath[0][j] = minimumCostPath[0][j - 1] + costMatrix[0][j], for all values of j >zero
Salin selepas log masuk

Seterusnya, kami akan mengisi matriks laluan kos minimum dengan menggunakan formula yang sama seperti yang digunakan dalam algoritma. Oleh kerana semua nilai sebelumnya telah dikira dalam matriks laluan kos minimum, kami tidak mengira semula nilai ini seperti dalam jawapan algoritma.

minimumCostPath[i][j] = costMatrix[i][j] +minimum(minimumCostPath[i - 1][j - 1],minimumCostPath[i - 1][j],minimumCostPath[i][j - 1])
Salin selepas log masuk

Di sini, untuk mengira minimumCostPath[i][j], kami cenderung menggunakan minimumCostPath[i - 1][j - 1], minimumCostPath[i - 1][j] dan minimumCostPath[i][j - 1] Akibatnya, ini adalah satu-satunya sel yang dibenarkan di mana kita mencapai minimumCostPath[i][j]. Akhir sekali, kami mengembalikan minimumCostPath[m][n].

Kerumitan masa algoritma pengaturcaraan dinamik ialah O(mn).

Contoh

Demonstrasi masa nyata

#include <iostream>
using namespace std;
int min_(int a, int b, int c){
   if (a < b)
      return (a < c) ? a : c;
   else
      return (b < c) ? b : c;
}
int min_cost(int cost[4][4], int m, int n){
   int i, j;
   int tot_cost[4][4];
   tot_cost[0][0] = cost[0][0];
   for (i = 1; i <= m; i++)
   tot_cost[i][0] = tot_cost[i - 1][0] + cost[i][0];
   for (j = 1; j <= n; j++)
      tot_cost[0][j] = tot_cost[0][j - 1] + cost[0][j];
   for (i = 1; i <= m; i++)
      for (j = 1; j <= n; j++)
         tot_cost[i][j] = min_(tot_cost[i - 1][j - 1], tot_cost[i - 1][j], tot_cost[i][j - 1]) + cost[i][j];
      return tot_cost[m][n];
}
int main(){
   int cost[4][4] = {
      { 9, 9, 4 },
      { 8, 0, 9 },
      {1, 2, 8}
   };
   cout<<" The minimum cost is "<<min_cost(cost, 2, 2);
   return 0;
}
Salin selepas log masuk

Output

The minimum cost is 17
Salin selepas log masuk

Atas ialah kandungan terperinci Program C untuk laluan kos minimum. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:tutorialspoint.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan