|
|
题目是这样的:有一个 [size=1.21em]n×mn×m 的网格,每个格子中有一个正整数。从网格的左上角 [size=1.21em](1,1)(1,1) 出发,每次只能向右或向下移动,到达右下角 [size=1.21em](n,m)(n,m)。求经过的格子数字之和最小的路径和。
第一行两个整数 [size=1.21em]n,mn,m
接下来 [size=1.21em]nn 行,每行 [size=1.21em]mm 个正整数,表示网格中的数字
正常使用DP因该长这样:
- #include<bits/stdc++.h>
- using namespace std;
- const int INF=0x3f3f3f3f;
- int main(){
- int n,m;
- cin>>n>>m;
- vector< vector<int> >dp(n+1, vector<int>(m+1,INF));
- vector< vector<int> >grid(n+1,vector<int>(m+1));
- dp[0][1]=0;
- dp[1][0]=0;
- for(int i=1;i<=n;i++){
- for(int j=1;j<=m;j++){
- cin>>grid[i][j];
- dp[i][j]=min(dp[i][j-1],dp[i-1][j])+grid[i][j];
- }
- }
- cout<<dp[n][m];
- }
复制代码 如果有问题告诉我因为我这个没验证
然后我偶然吧输入时的grid[j]输成了grid[n][m]然后答案对了
试了好多个之后都对了,然后我就改成了这样:
- #include<bits/stdc++.h>
- using namespace std;
- const int INF=0x3f3f3f3f;
- int main(){
- int n,m,flag;
- cin>>n>>m;
- vector< vector<int> >dp(n+1, vector<int>(m+1,INF));
- dp[0][1]=0;
- dp[1][0]=0;
- for(int i=1;i<=n;i++){
- for(int j=1;j<=m;j++){
- cin>>flag;
- dp[i][j]=min(dp[i][j-1],dp[i-1][j])+flag;
- }
- }
- cout<<dp[n][m];
- }
复制代码 然后还是对的,这样就省掉了一个二维数组 |
|