P1095求大佬教我滚动数组怎么写
  • 板块题目总版
  • 楼主KMSK
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/11/1 13:08
  • 上次更新2023/11/4 01:39:01
查看原帖
P1095求大佬教我滚动数组怎么写
472423
KMSK楼主2021/11/1 13:08

80分动态规划超内存两个点,想改为滚动数组节省空间

不会写滚动数组,就算会写也是时间换取空间,估计又会超时叭

代码如下(纯dp无太多优化,最后一个点300ms,时间复杂度不算太差)

using namespace std;
int f[300001][1001];//时间和法力值 存储的是距离 
int m,s,t;
int anss=0;//用来更新距离,以便不能到达时输出最远的距离 
int main()
{
	cin>>m>>s>>t;
    for(int i=1;i<=t;i++)
    {
    	for(int j=m;j>=0;j--)
    	{
    		if(j>=10)//法力值够用,贪心,能闪则闪 
			{
			if(f[i-1][j]+60>f[i][j])f[i][j-10]=f[i-1][j]+60;
			anss=max(anss,f[i][j-10]);
		}
			else //法力值不够用就存法力值或者直接跑17m 
			{
				if(f[i-1][j]>f[i][j+4])f[i][j+4]=f[i-1][j];
				if(f[i-1][j]+17>f[i][j])f[i][j]=f[i-1][j]+17;
				anss=max(anss,max(f[i][j+4],f[i][j]));
			}
			if(f[i][j]>=s)//如果距离够了就输出 
			{
				cout<<"Yes"<<endl;
				cout<<i<<endl;
				return 0;
			 } 
			 else anss=max(anss,f[i][j]);//距离不够就更新得到更远的距离 
		}
	}
	cout<<"No"<<endl;
	cout<<anss<<endl;
	return 0;
}
2021/11/1 13:08
加载中...