8.17集训笔记

HelloHeBin / 2023-08-17 / 原文

上午二维数组/函数

  • B2101 计算矩阵边缘元素之和
    分析:尽量对每个元素只遍历一次,如果发现是边缘元素,那么加入即可。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int n,m,a[N][N];

int main(){
    cin>>n>>m;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++) cin>>a[i][j];
    int ans=0;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++) {
            if(i==1 || j==1 || i==n || j==m)
                ans += a[i][j];
        }
    cout<<ans;
    return 0;
}
  • P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles
    分析:方法1:从上到下,最后一行的最大值就是答案;
    方法2:从下到上,第一个就是答案;
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,m,a[N][N];

int main(){
    cin>>n;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=i; j++) cin>>a[i][j];
//    从上到下 
//    for(int i=1; i<=n; i++)
//        for(int j=1; j<=i; j++)
//            a[i][j] += max(a[i-1][j], a[i-1][j-1]);
//    int ans=0;
//    for(int j=1; j<=n; j++) ans=max(ans, a[n][j]);
//    cout<<ans;
//    从下到上
    for(int i=n-1; i>=1; i--){
        for(int j=1; j<=i; j++){
            a[i][j] += max(a[i+1][j], a[i+1][j+1]);
        }
    }
    cout<<a[1][1];
    return 0;
}
  • P1002 [NOIP2002 普及组] 过河卒
    分析:根据数据找规律,使用偏移数组和标记数组,对马儿能到的位置进行标记,该位置的方案一定为0,至于规律一定要自己模拟一下,比如写出对于 4*4 的矩阵,每个点的方案数,然后找到规律:a[i][j] = a[i-1][j] + a[i][j-1];
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int n,m,a[N][N];
int dx[9]={0,2,1,-1,-2,-2,-1, 1, 2};
int dy[9]={0,1,2, 2, 1,-1,-2,-2,-1};
bool st[N][N];

int main(){
    int n,m,x,y;
    cin>>n>>m>>x>>y;
    a[1][0]=1;
    for(int i=0; i<9; i++) {
        int tx=x+dx[i], ty=y+dy[i];
        st[tx][ty] = 1;
    }
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++) cout<<st[i][j]<<" "; cout<<endl;
    }cout<<endl;
    for(int i=1; i<=n+1; i++){
        for(int j=1; j<=m+1; j++){
            a[i][j] = a[i-1][j] + a[i][j-1];
            if(st[i-1][j-1]) a[i][j]=0;
        }
    }
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++) cout<<a[i][j]<<" "; cout<<endl;
    }cout<<endl;
    cout<<a[n+1][m+1];
    return 0;
}

函数笔记:

函数练习、递归入门

  • P5723 【深基4.例13】质数口袋
  • B3738 [信息与未来 2018] 素数方阵
  • P5735 【深基7.例1】距离函数
  • P5737 【深基7.例3】闰年展示