【动态规划】最小代价问题
生活随笔
收集整理的這篇文章主要介紹了
【动态规划】最小代价问题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
最小代價(jià)問題
Description
設(shè)有一個(gè)n×m(小于100)的方格(如圖所示),在方格中去掉某些點(diǎn),方格中的數(shù)字代表距離(為小于100的數(shù),如果為0表示去掉的點(diǎn)),試找出一條從A(左上角)到B(右下角)的路徑,經(jīng)過的距離和為最小(此時(shí)稱為最小代價(jià)),從A出發(fā)的方向只能向右,或者向下。
Sample Input
4 4
4 10 7 0
3 2 2 9
0 7 0 4
11 6 12 1
Sample Output
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)
24
解題思路
用遞推的方式一步一步推,還要判斷是否是0 (0代表沒有這個(gè)點(diǎn)),當(dāng)這個(gè)點(diǎn)是最后一個(gè)點(diǎn)時(shí),減去這個(gè)點(diǎn)。(最后一個(gè)點(diǎn)不算)
#include<cstdio> using namespace std; int a[110][110],b[110][110],c[110][110],n,m; void dg(int x,int y) {if (x==1&&y==1){printf("(1,1)");return;}if (c[x][y]==1) dg(x-1,y);else dg(x,y-1);printf("->(%d,%d)",x,y); } int main() {scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){scanf("%d",&a[i][j]);//讀入,因?yàn)楫?dāng)前位置的最小代價(jià)只和前面有關(guān),所以可以一起放在一起。if (i==1&&j==1) b[1][1]=a[1][1];//b(1,1)沒有上一步,所以要直接加。if ((b[i-1][j]<=b[i][j-1]||b[i][j-1]==0)&&b[i-1][j])//上面的數(shù)小一點(diǎn)或左邊沒有數(shù),還要判斷上面是否為0{b[i][j]=b[i-1][j]+a[i][j];c[i][j]=1;}if ((b[i-1][j]>b[i][j-1]||b[i-1][j]==0)&&b[i][j-1])//左面的數(shù)小一點(diǎn)或上邊沒有數(shù),還要判斷左面是否為0b[i][j]=b[i][j-1]+a[i][j];if (a[i][j]==0) b[i][j]=0;//如果當(dāng)前值為0,清除b值}dg(n,m);printf("\n%d",b[n][m]-a[n][m]); }總結(jié)
以上是生活随笔為你收集整理的【动态规划】最小代价问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十二星座各是哪些 十二星座有哪些
- 下一篇: 赛尔号青龙怎么打 赛尔号青龙打法介绍