洛谷 P1005 矩阵取数游戏

题面描述

明显dp,看着像区间dp,状态是由大到小写的也可由小到大.这边展示两种转移方式的代码

不同的是从大到小要预处理一下2的幂级数
速度上没差
速度上没明显差

//small->big
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;
const double pi=acos(-1),eps=1e-8;
template <typename _Tp> inline void read(_Tp&x);
inline void print(__int128 x);
__int128 n,m,ans=0;
__int128 a[100],f[100][100];
__int128 p[100];

int main()
{
	int i,j,k;
	read(n),read(m);
	p[0]=1;
	for(i=1;i<=m+2;i++){
		p[i]=p[i-1]*2;
	}
	for(;n;n--){
		memset(f,0,sizeof(f));
		for(j=1;j<=m;j++)read(a[j]);
		for(i=0;i<=m;i++){
			for(j=1;j+i<=m;j++){
				f[j][j+i]=max(2*f[j+1][j+i]+2*a[j],2*f[j][j+i-1]+2*a[j+i]);
			}
		}
		ans+=f[1][m];
	}
	print(ans);
 	return 0;
}
template <typename _Tp> inline void read(_Tp&x) {
	char ch;bool flag=0;x=0;
	while(ch=getchar(),!isdigit(ch)) if(ch=='-')flag=1;
	while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
	if(flag) x=-x;
}
inline void print(__int128 x) {
	if(x<0) {x=-x;putchar('-');}
	if(x>9) print(x/10);
	putchar(x%10+'0');
}

//big->samll
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
const int INF=0x3f3f3f3f;
const double pi=acos(-1),eps=1e-8;
template <typename _Tp> inline void read(_Tp&x);
inline void print(__int128 x);
__int128 n,m,ans=0;
__int128 a[100],f[100][100];
__int128 p[100];
int i,j,k;
int main()
{
	read(n),read(m);
	p[0]=1;
	for(i=1;i<=m+2;i++){
		p[i]=p[i-1]*2;
	}
	for(;n;n--){
		memset(f,0,sizeof(f));
		for(j=1;j<=m;j++)read(a[j]);
		
		for (i = 1; i <= m; i++)
		for (j = m; j >= i; j--) { 
			f[i][j] = max(f[i][j], f[i - 1][j] + p[m - j + i - 1] * a[i - 1]); 
			f[i][j] = max(f[i][j], f[i][j + 1] + p[m - j + i - 1] * a[j + 1]);
		}
		__int128 tmp=0;
		for(i=1;i<=m;i++)tmp=max(tmp,f[i][i]+p[m]*a[i]);
		ans+=tmp;
	}
	print(ans);
 	return 0;
}
template <typename _Tp> inline void read(_Tp&x) {
	char ch;bool flag=0;x=0;
	while(ch=getchar(),!isdigit(ch)) if(ch=='-')flag=1;
	while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
	if(flag) x=-x;
}
inline void print(__int128 x) {
	if(x<0) {x=-x;putchar('-');}
	if(x>9) print(x/10);
	putchar(x%10+'0');
}

你可能感兴趣的:(基础算法)