求大家帮看看为什么不是满分

问题描述
  给定一个长为n的序列,求它的最长上升子序列的长度和一种方案。
输入格式
  输入第一行包含一个整数n。
  第二行包含n个整数,为给定的序列。
输出格式
  输出的第一行包含一个非负整数,表示最长上升子序列的长度。
  第二行包含多个整数,为最长上升子序列中的元素对应的下标 ,按下标从小到大的顺序输出。
样例输入
5
1 3 2 5 4
样例输出
3
1 3 4
样例输入
5
8 5 7 9 1
样例输出
3
2 3 4
数据规模和约定
0

#include
using namespace std;
int n;
int a[3005];
int dp[3005]={0};
void DPandoutput()
{
  int maxz = 0, s[1005];
    int posdp,pos=1;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);
    for(int i=1;i<=n;i++){
        dp[i]=1;
        for(int j=1;jif(a[i]>a[j])
            {
                dp[i]=max(dp[j]+1,dp[i]);
                if(dp[i]>=maxz)
                pos=i;
                maxz=max(maxz,dp[i]);
            }
        }
    }
    printf("%d\n",maxz);
    posdp=maxz;
    s[1]=a[pos];
    int count=1;
    for(int i=pos-1;i>=1;i--){
        if(dp[i]==posdp-1)
        {
            s[++count]=a[i];
            posdp=dp[i];
        }
    }
    for(int i=count;i>=1;i--)
      for (int j = n; j >= 1; j--)
        if (s[i] == a[j]) printf("%d ",j);
    printf("\n");
    return;
}
int main()
{
    DPandoutput();
    return 0;
}

img

除样例外又测了多组数据,输出都正确,求各位帮本蒟蒻看看程序有什么问题,谢谢!

你这思路整个就是混乱的
maxz和pos是在干什么呀,你为什么要找到最大的数的位置呀
最大的数在哪和最长序列有一毛钱关系吗
思路没捋清楚,别着急写代码
先用伪代码把要干什么写出来,觉得逻辑通顺了再翻译成代码
否则写着写着你自己都不知道代码是在干什么