作业介绍

都是后面的算法题目,除了第一题稍微简单,后面两题都比较难。

第二题一杯柠檬水,第三题一杯奶茶!

摘花生

#include <bits/stdc++.h>
using namespace std;

int a[105][105];
int main() {
	int t;
	cin >> t;
	int n,m;
	while(t--){
		cin >> n >> m;
		for(int i=1; i<=n; i++){
			for(int j=1; j<=m; j++){
				cin >> a[i][j];
			}
		}
		for(int i=1; i<=n; i++){
			for(int j=1; j<=m; j++){
				//如果是第一行
                //如果是第二行
                //看左边过来更多花生,还是上边过来最多花生?
			}
		}
		cout << a[n][m]<<endl;
	}
	return 0;
}

方格取数

using namespace std;

const int N=15;
int w[N][N];
//f[k][i1][i2]中的i1表示第一条路走到了i1行
//f[k][i1][i2]中的i2表示第二条路走到了i2行
//k表示每条路的(i1,j1)点中的i1+j1,同时也是i2+j2
//由于是同时走,所以k是一样的
int f[N*2][N][N];
int n;
int a,b,c;
int main(){
    scanf("%d", &n);
    while(cin >> a >> b >> c, a||b||c) w[a][b] = c;

    for(int k=2; k<=n*2; k++){
        for(int i1=1; i1<=n; i1++){
            for(int i2=1; i2<=n; i2++){
                int j1=k-i1, j2=k-i2;
                if(j1>=1 && j1<=n && j2>=1 && j2<=n){
                    int t = w[i1][j1];             
                    //如果(i1,j1),(i2,j2)不是一个点,说明两个点的花生都可以取,加上
                    if(i1 != i2) t += w[i2][j2];
                    int &x = f[k][i1][i2];
                    //下下
                    x = max(x, f[k-1][i1-1][i2-1] + t);
                    //右下
                    x = max(x, f[k-1][i1][i2-1] + t);
                    //下右
                    x = max(x, f[k-1][i1-1][i2] + t);
                    //右右
                    x = max(x, f[k-1][i1][i2] + t);
                }
            }
        }
    }
    printf("%d\n", f[n+n][n][n]);
    return 0;
}
状态
已结束
题目
3
开始时间
2023-10-28 0:00
截止时间
2023-11-5 23:59
可延期
24 小时