社区讨论

60pts求调

P1005[NOIP 2007 提高组] 矩阵取数游戏参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhj0g8id
此快照首次捕获于
2025/11/03 18:42
4 个月前
此快照最后确认于
2025/11/03 18:42
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int n, m, a[1005];

__int128 dp[85][85], pw[1005], ans;
inline int read(){
    register char c = getchar();
	register int f = 1,x = 0;
    while(c<'0'||c>'9'){
    	if(c=='-')f = -1;
		c = getchar();
	}
    while(c>='0'&&c<='9')x = (x<<3)+(x<<1)+c-'0',c = getchar();
    return x*f;
}
inline void write(register int x){
    register int cnt = 20,st[25];
    if(x==0)putchar('0');
	while(x){
		st[cnt--] = char(x%10+'0');
		x/=10;
	}
	while(cnt<20)putchar(st[++cnt]);
	putchar('\n');
	return;
}
signed main()
{
    n = read(), m = read();
	pw[0] = 1;
	for(int i = 1; i <= 80; i ++)
    {
		pw[i] = pw[i - 1] * 2;
	}
	for(int k = 1; k <= n; k ++)
    {
		memset(dp, 0, sizeof(dp));
		for(int i = 1; i <= m; i ++)
        {
            cin >> a[i];
			dp[i][i] = a[i] * pw[m];
		}
		for(int len = 2; len <= m; len ++)
        {
			for(int i = 1; i + len - 1 <= m; i ++)
            {
				int j = i + len - 1;
				dp[i][j] = max(dp[i][j] , dp[i + 1][j] + a[i] * pw[m - j + i]);
				dp[i][j] = max(dp[i][j] , dp[i][j - 1] + a[j] * pw[m - j + i]);
			}
		}
		ans += dp[1][m];
	}
    write(ans);
}

回复

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

正在加载回复...