社区讨论

56分求助

P1004[NOIP 2000 提高组] 方格取数参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mjfkypmg
此快照首次捕获于
2025/12/21 18:24
2 个月前
此快照最后确认于
2025/12/21 22:00
2 个月前
查看原帖
只有核心部分是我写的 其它是ai 所以有些注释
C
#include <stdio.h>
#include <string.h>

int max4(int a, int b, int c, int d) {
    int temp = a > b ? a : b;
    temp = temp > c ? temp : c;
    temp = temp > d ? temp : d;
    return temp;
}


int grid[10][10];  // 存储方格中的数值,初始全0
int dp[20][10][10]={0};// 总步数,x1,x2 

int main() {
    // ===== 常规输入处理(纯C固定逻辑,无需修改)=====
    int N;
    scanf("%d", &N);
    int x, y, val;
    while (1) {
        scanf("%d %d %d", &x, &y, &val);
        if (x == 0 && y == 0 && val == 0) {
            break;
        }
        grid[x][y] = val; // 填充方格数值
    }

    // ===== 核心DP逻辑(请你补充以下部分)=====

	dp[0][1][1]=grid[1][1];
	for(int i=1;i<=(N-1)*2;i++)//zongbushu
	{
		for(int j=1;j<=i;j++)//x1
		{
			if(j<=N)
			{
				//int y2=k+2-j;
				//if(y2<1||y2>N) continue;
				for(int k=1;k<=i;k++)//x2
				{
					if(k<=N)
					{
						//int y2 = i - k + 2; 
                        //if(y2 < 1 || y2 > N) continue; 
						int a = dp[i-1][j][k]; 
                  	    int b = (j-1 >= 1) ? dp[i-1][j-1][k] : 0; // j=1时,j-1=0,无效值置0
                  	 	int c = (k-1 >= 1) ? dp[i-1][j][k-1] : 0; // k=1时,k-1=0,无效值置0
                  	    int d = (j-1 >= 1 && k-1 >= 1) ? dp[i-1][j-1][k-1] : 0; // 双无效置0
                        int max_prev = max4(a, b, c, d);
                        dp[i][j][k]=max_prev+grid[k][i-k+2]+grid[j][i-j+2];
						if(j==k) dp[i][j][k]-=grid[j][i-j+2];
					}
					
				}
			}
			
		}
	}
	
    // ===== 常规输出处理=====
    printf("%d\n", dp[2*N-2][N][N]);
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...