超级玛丽游戏——洛谷P1000

其实,这道题并不难,我们这里使用动态规划来解决这道题,这就是传说中的超级玛丽用dp。当然,编者a+b确是也TLE了。在此与各位读者分享一下心得。

本蒟蒻实在是太菜了,导致这道题只想出了一种dp+矩阵的做法,时间复杂度为O(n^2m),不过优化后可变成O(nm)的。

#include<bits/stdc++.h>
using namespace std;
int a[25][65];
int g[23][23];
int f[63][23];
int ans[63][23];
void mul(int x)
{
	for(int i=0;i<22;i++)
	{
		for(int k=0;k<22;k++)
		{
			ans[x][i]=max(ans[x][i],g[i][k]+f[x][k]);
		}
	}
}
int main()
{
	memset(g,-0x3F,sizeof g);
	for(int i=0;i<22;i++)
	{
		g[i][i]=0;
	}
	string s[23];
	s[1]= "00000000000000003333333300000000000000000000000000000000000000";
	s[2]= "00000000000000033333333333300000000000000000000000000000000000";
	s[3]= "00000000000000011112222120000000000000000000000000000000000000";
	s[4]= "00000000000001221112222211222200000000000000000000000000000000";
	s[5]= "00000000000001112222222111111000000000000001110000000000001110";
	s[6]= "00000000000000002222222222200000000000000012221000000000012221";
	s[7]= "00000000000000011311111110000000000000000012121000000000012121";
	s[8]= "00000000000011113333333111111000000000000012121000000000012121";
	s[9]= "00000000000222133323333231112222000000000012221000000000012221";
	s[10]="00000000000222233333333331122222000000000001110000000000001110";
	s[11]="00000000000222233330000333332222000000000000000000000000000000";
	s[12]="00000000000001111000000001111000000000000000000000000000000000";
	s[13]="00000000000111111000000001111110000000000000000000000000000000";
	s[14]="11111111111111111111111111111111111111111111111111111111111111";
	s[15]="12221222222121122212222221211222122222212114444444444444444441";
	s[16]="11111111111111111111111111111111111111111114444444444444444441";
	s[17]="12212222122221122122221222211221222212222111111111111111111111";
	s[18]="11111111111111111111111111111111111111111100001444444444410000";
	s[19]="12222212222221122222122222211222221222222100001444444444410000";
	s[20]="11111111111111111111111111111111111111111100001444444444410000";
	s[21]="12122122221221121221222212211212212222122100001444444444410000";
	s[22]="11111111111111111111111111111111111111111100001111111111110000";
	for(int i=1;i<=22;i++)
	{
		for(int j=0;j<62;j++)
		{
			a[i][j]=s[i][j]-'0';
		}
	}
	for(int j=0;j<62;j++)
	{
		for(int i=1;i<=22;i++)
		{
			f[j][i-1]=a[i][j];//√ 
		}
	}
	for(int j=0;j<62;j++)
	{
		mul(j);
	}
	for(int j=0;j<62;j++)
	{
		for(int i=1;i<=22;i++)
		{
			a[i][j]=ans[j][i-1];
		}
	}
	for(int i=1;i<=22;i++)
	{
		for(int j=0;j<62;j++)
		{
			if(a[i][j]==0)
			{
				cout<<" ";
			}
			else if(a[i][j]==1)
			{
				cout<<"#";
			}
			else if(a[i][j]==2)
			{
				cout<<".";
			}
			else if(a[i][j]==3)
			{
				cout<<"*";
			}
			else if(a[i][j]==4)
			{
				cout<<"-";
			}
		}
		cout<<endl;
	}
	return 0;
} 

这是洛谷上AC的代码。

当然,我们可以想办法去处理更复杂一点的超级玛丽游戏的界面,比如1000行,1000列。这时我们可以分析一下g矩阵,发现其除对角线外全是-∞,所以,我们可以用O(n)处理对角线,即可。

O(nm)代码:

#include<bits/stdc++.h>
using namespace std;
int a[25][65];
int g[23][23];
int f[63][23];
int ans[63][23];
void mul(int x)
{
	for(int i=0;i<22;i++)
	{
//		for(int k=0;k<22;k++)
//		{
			ans[x][i]=max(ans[x][i],g[i][i]+f[x][i]);
//		}
	}
}
int main()
{
	memset(g,-0x3F,sizeof g);
	for(int i=0;i<22;i++)
	{
		g[i][i]=0;
	}
	string s[23];
	s[1]= "00000000000000003333333300000000000000000000000000000000000000";
	s[2]= "00000000000000033333333333300000000000000000000000000000000000";
	s[3]= "00000000000000011112222120000000000000000000000000000000000000";
	s[4]= "00000000000001221112222211222200000000000000000000000000000000";
	s[5]= "00000000000001112222222111111000000000000001110000000000001110";
	s[6]= "00000000000000002222222222200000000000000012221000000000012221";
	s[7]= "00000000000000011311111110000000000000000012121000000000012121";
	s[8]= "00000000000011113333333111111000000000000012121000000000012121";
	s[9]= "00000000000222133323333231112222000000000012221000000000012221";
	s[10]="00000000000222233333333331122222000000000001110000000000001110";
	s[11]="00000000000222233330000333332222000000000000000000000000000000";
	s[12]="00000000000001111000000001111000000000000000000000000000000000";
	s[13]="00000000000111111000000001111110000000000000000000000000000000";
	s[14]="11111111111111111111111111111111111111111111111111111111111111";
	s[15]="12221222222121122212222221211222122222212114444444444444444441";
	s[16]="11111111111111111111111111111111111111111114444444444444444441";
	s[17]="12212222122221122122221222211221222212222111111111111111111111";
	s[18]="11111111111111111111111111111111111111111100001444444444410000";
	s[19]="12222212222221122222122222211222221222222100001444444444410000";
	s[20]="11111111111111111111111111111111111111111100001444444444410000";
	s[21]="12122122221221121221222212211212212222122100001444444444410000";
	s[22]="11111111111111111111111111111111111111111100001111111111110000";
	for(int i=1;i<=22;i++)
	{
		for(int j=0;j<62;j++)
		{
			a[i][j]=s[i][j]-'0';
		}
	}
	for(int j=0;j<62;j++)
	{
		for(int i=1;i<=22;i++)
		{
			f[j][i-1]=a[i][j];//√ 
		}
	}
	for(int j=0;j<62;j++)
	{
		mul(j);
	}
	for(int j=0;j<62;j++)
	{
		for(int i=1;i<=22;i++)
		{
			a[i][j]=ans[j][i-1];
		}
	}
	for(int i=1;i<=22;i++)
	{
		for(int j=0;j<62;j++)
		{
			if(a[i][j]==0)
			{
				cout<<" ";
			}
			else if(a[i][j]==1)
			{
				cout<<"#";
			}
			else if(a[i][j]==2)
			{
				cout<<".";
			}
			else if(a[i][j]==3)
			{
				cout<<"*";
			}
			else if(a[i][j]==4)
			{
				cout<<"-";
			}
		}
		cout<<endl;
	}
	return 0;
} 

我们可不可以进一步的优化呢?答案是肯定的。我们可以发现,矩阵的对角线上全是0,所以乘完之后相当于一个间接的赋值,而这样看来后面的一整段都是没有意义的所以我们可以直接将打出来的表还原成字符串的即可,时间复杂度O(1),空间复杂度O(n*m).

以下是本蒟蒻的代码:

#include<iostream>
using namespace std;
int main()
{
	cout<<"                ********"<<endl;
	cout<<"               ************"<<endl;
	cout<<"               ####....#."<<endl;
	cout<<"             #..###.....##...."<<endl;
	cout<<"             ###.......######              ###            ###"<<endl;
	cout<<"                ...........               #...#          #...#"<<endl;
	cout<<"               ##*#######                 #.#.#          #.#.#"<<endl;
	cout<<"            ####*******######             #.#.#          #.#.#"<<endl;
	cout<<"           ...#***.****.*###....          #...#          #...#"<<endl;
	cout<<"           ....**********##.....           ###            ###"<<endl;
	cout<<"           ....****    *****...."<<endl;
	cout<<"             ####        ####"<<endl;
	cout<<"           ######        ######"<<endl;
	cout<<"##############################################################"<<endl;
	cout<<"#...#......#.##...#......#.##...#......#.##------------------#"<<endl;
	cout<<"###########################################------------------#"<<endl;
	cout<<"#..#....#....##..#....#....##..#....#....#####################"<<endl;
	cout<<"##########################################    #----------#"<<endl;
	cout<<"#.....#......##.....#......##.....#......#    #----------#"<<endl;
	cout<<"##########################################    #----------#"<<endl;
	cout<<"#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#"<<endl;
	cout<<"##########################################    ############"<<endl;
	return 0;
} 

 

<think>好的,用户的问题是关于在Ubuntu上以超级用户身份启动VSCode时遇到的权限问题,需要解决如何正确使用no-sandbox和user-data-dir参数。首先,我需要回忆相关的解决方案,并结合提供的引用资料来整理步骤。 根据引用[3]中的描述,当以超级用户运行code命令时,VSCode会警告不推荐这样做,并建议添加--no-sandbox参数,并指定--user-data-dir。引用[1]和[4]提供了具体的命令示例,其中引用[4]提到使用code --user-data-dir=~/.vscode --no-sandbox,这应该是一个有效的解决方案。同时,引用[5]提到在Chrome浏览器中类似的问题,也使用了--no-sandbox参数,这说明这种解决方式在Electron应用中是常见的。 接下来,我需要确保用户理解每个参数的作用:--no-sandbox禁用沙盒模式以提升权限,而--user-data-dir指定用户数据目录,避免权限冲突。然后,需要将这些参数组合到命令中,并建议用户创建一个别名方便后续使用,如alias vscode='code --user-data-dir=/root/.vscode --no-sandbox'。 另外,需要注意安全提示,因为禁用沙盒可能带来风险,用户应仅在必要时使用。同时,检查是否正确安装了VSCode,确保路径正确,避免命令无法找到的情况。 最后,生成相关问题需要考虑用户可能遇到的类似问题,比如其他Electron应用的处理方式,或者如何永久配置这些参数,以及权限问题的其他解决方法。确保问题覆盖了用户可能扩展的需求,帮助用户更全面地理解问题。</think>### 逐步解决方案 在Ubuntu系统中以超级用户身份启动VSCode时,由于安全限制和沙盒机制,需通过以下步骤解决权限问题: 1. **添加`--no-sandbox`参数** 禁用沙盒模式以绕过权限限制,但需注意这会降低安全性,仅建议在必要时使用。 ```bash code --no-sandbox ``` 2. **指定用户数据目录`--user-data-dir`** 避免因默认目录权限不足导致启动失败,需为root用户单独指定存储路径。例如: ```bash code --user-data-dir=/root/.vscode --no-sandbox ``` 3. **组合使用参数(推荐)** 同时添加上述两个参数,确保兼容性和稳定性[^1][^3][^4]。 ```bash code --no-sandbox --user-data-dir=/root/.vscode ``` 4. **创建别名简化命令(可选)** 在`~/.bashrc`中添加别名,例如: ```bash alias vscode='code --user-data-dir=/root/.vscode --no-sandbox' ``` 执行`source ~/.bashrc`后,可直接通过`vscode`命令启动。 ### 注意事项 - **安全风险**:禁用沙盒可能使系统暴露于潜在漏洞,建议仅在可信环境使用[^5]。 - **路径验证**:确保`/root/.vscode`目录存在且权限正确。 - **安装检查**:若`code`命令未找到,需通过`snap`或`apt`重新安装VSCode。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值