社区讨论
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 条回复,欢迎继续交流。
正在加载回复...