动态规划

数字三角形模型

摘花生

image-20230816214435544

因为只能从上面和左边过来,所以有状态转移方程:dp[i][j]=(dp[i-1][j],dp[i][j-1])+a[i][j]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <algorithm>
using namespace std;
const int N=105;
int n;
int a[N][N],dp[N][N];
int main()
{
cin>>n;
int r,c;
while(n--)
{
cin>>r>>c;
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j];
}
}
cout<<dp[r][c]<<endl;
}
return 0;
}

最低通信费

N*N的正方形方格,左上角进右下角出,题目条件总路径长度为2*N+1,即只能向下或者向右走,递推方程为dp[i][j]=min(dp[i-1][j],dp[i][j-1])+a[i][j]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <cstring>
using namespace std;
const int N=105;
int a[N][N];
int dp[N][N];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
memset(dp,0x3f,sizeof dp);//边界处理
//处理dp[1][1]
dp[0][1]=0;
dp[1][0]=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+a[i][j];
}
}
cout<<dp[n][n];
return 0;
}