我给出代码如下:和之前做数塔(dp的入门题目)的思路一致
dp[i][j]为走到坐标(i,j)的最小减速(只有向右走和向上走两种情况)
#include<stdio.h> #include<stdlib.h> #include<iostream> #include <algorithm> using namespace std; const int maxn=1002; int dp[maxn][maxn]; int main() {int n; scanf("%d",&n); for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>dp[i][j]; for(int i=0;i<n;i++)//因为不走回头路所以最上面的一行和最左面一列只有一种情况 { for(int j=0;j<n;j++) { if(i==0&&j>=1)dp[i][j]+=dp[i][j-1]; else if(j==0&&i>=1)dp[i][j]+=dp[i-1][j]; else if(i>=1&&j>=1) dp[i][j]+=min(dp[i][j-1],dp[i-1][j]); } } //测试 // for(int i=0;i<n;i++) // { // for(int j=0;j<n;j++) // cout<<dp[i][j]<<" "; // cout<<endl; // } cout<<dp[n-1][n-1]<<endl; return 0; }
个人代码如下:
#include<stdio.h> #include<stdlib.h> #include<iostream> #include<string> #include <algorithm> using namespace std; const int maxn=10005; int main() { string s1,s2; int ver1[maxn];//把版本数字分离出来放在数组中 int ver2[maxn]; cin>>s1>>s2; fill(ver1,ver1+maxn,0); fill(ver2,ver2+maxn,0); int top1=0,top2=0; int sum=0; for(int i=0;i<s1.size();i++) { if(s1[i]!='.') { sum=sum*10+(s1[i]-'0'); } if(s1[i]=='.'||i==s1.size()-1) { ver1[top1]=sum; top1++; sum=0; } }sum=0; for(int i=0;i<s2.size();i++) { if(s2[i]!='.') { sum=sum*10+(s2[i]-'0'); } if(s2[i]=='.'||i==s2.size()-1) { ver2[top2]=sum; top2++; sum=0; } } int f=0; for(int i=0;i<(top1>=top2? top1:top2);i++) { if(ver1[i]>ver2[i]) { f=1;break; } if(ver1[i]<ver2[i]){ f=-1;break; } }cout<<f<<endl; return 0; }
解题思路:和之前写1-n*n的思路差不多,只不过这次我没有加围墙是加了一个访问数组进行判断
加围墙的思路:https://www.cnblogs.com/cstdio1/p/10903090.html
代码如下:
#include <iostream> #include<string> #include<cstring> #include<algorithm> using namespace std; const int maxn=1005;//之前maxn给的10005内存超限 int a[maxn][maxn]; bool vis[maxn][maxn];//是否访问数组 int main () { int m,n;//m行n列的矩阵 int i,j; while(cin>>m&&cin>>n&&m!=-1&&n!=-1){ for(i=0;i<m;i++) for(j=0;j<n;j++) cin>>a[i][j]; int cnt=0;//计算输出元素个数 memset(vis,0,sizeof(vis));//重置标志数组 i=0;j=0;//初始化起点坐标 while(cnt<n*m) { while(j<n&&!vis[i][j])//turn right { cout<<a[i][j]<<(cnt==n*m-1? "":","); vis[i][j]=true; j++;cnt++; }i++;j--;//和之前我写1-n*n填数是一样的 while(i<m&&!vis[i][j])//turn down { cout<<a[i][j]<<(cnt==n*m-1? "":","); vis[i][j]=true; i++;cnt++; }i--;j--; while(j>=0&&!vis[i][j])//turn left { cout<<a[i][j]<<(cnt==n*m-1? "":","); vis[i][j]=true; j--;cnt++; }i--;j++; while(i>=0&&!vis[i][j])//turn up { cout<<a[i][j]<<(cnt==n*m-1? "":","); vis[i][j]=true; i--;cnt++; }i++;j++; }cout<<endl; } }