2018秋招blibli算法工程师

我给出代码如下:和之前做数塔(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;
         
         
         
    }
 
 
 
}
  
不一样的烟火
原文地址:https://www.cnblogs.com/cstdio1/p/11083964.html