问题标题: 酷町堂:1526这题的难度都不在DP了。。。

0
0
已解决
黄子扬
黄子扬
初级天翼
初级天翼
/*
8
389 207 155 300 299 170 158 65
*/
#include<bits/stdc++.h>
using namespace std;
int a[100005],f[100005],i,n,maxn=1,maxnk,sum,k[100005];
void debug()
{
	cout<<f[i]<<" ";
}
int main()
{
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	    scanf("%d",&a[i]);
	for(i=1;i<=n;i++)
	{
		k[1]=1; 
		f[i]=1;
		for(int j=1;j<i;j++)
		    if(a[i]<a[j])
		        f[i]=max(f[i],f[j]+1);
		for(int j=1;j<i;j++)
		    if(a[i]<a[j])
		    {
		    	if(f[j]+1==f[i])
		    	{
		    	   k[i]+=k[j];
//		    	   cout<<j<<" "<<k[j]<<endl;
		        }
			}
		//debug();
		if(f[i]>=maxn)
		{
		maxn=f[i];
	    }
	}
	for(int i=1;i<=n;i++)
	    if(f[i]==maxn)
	        maxnk+=k[i];
//	cout<<k[6]<<" "<<k[8]<<endl;
    cout<<maxn<<" "<<maxnk<<endl;
	return 0;
}

10分,debug许久过了样例,然后挂了九个点

黄子扬在2020-08-01 09:49:09追加了内容

@赵逸凡 大佬看下


0
已采纳
赵逸凡
赵逸凡
初级启示者
初级启示者

@黄子扬 

maxn的输出应该没有问题,maxnk的运算有些看不懂 /kel

对于maxnk,我有个简便思路:

先遍历找到maxn,再遍历一遍找到与maxn相等的f[i],此时ans++

显然有bug,如果f[i]本身的取值很多就会被hack掉,而且这道题空间、时间卡的特别细,N<=5000

PS:输出结果可以改成maxn和ans,这样看起来更直观

0
王子健
王子健
初级天翼
初级天翼

难道大佬才学到动规?

0
我要回答