zoukankan      html  css  js  c++  java
  • 洛谷P1799 数列[NOI导刊]

    题目

    dp状态定义的好题,初看这个题其实并不好想到他的状态,但是可以根据状态的定义,需要满足最优子结构。还有比较重要的一点就是方便转移方程。

    首先我们定义dp[i]表示前i个数所能得到的最多个数,发现并不好转移,因此我们考虑多加一维状态j表示前i个数选j个的最多个数。这样就可以得出状态转移方程了。

    #include <bits/stdc++.h>
    using namespace std;
    int n, ans, a[100101], dp[5101][5101];// dp[i][j]表示前i个数里面剩下j个数所得到的最好个数
    struct d {
     	int a, id;
    }data[100100];
    int main()//不是最长上升子序列。
    {
     	scanf("%d", &n);
     	for (int i = 1; i <= n; i++)
     		scanf("%d", &data[i].a);// a[i]=i有多少最多能取多少个 
     	memset(dp, 0, sizeof(dp));  // 使a[i]变成i的值
     	for (int i = 1; i <= n; i++)
    	 	if (data[i].a == i)
    		 	dp[i][1] = 1;
     	for (int i = 1; i <= n; i++)
     		for (int j = 1; j <= i; j++)
     		{
    		 	dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]);
     			if (data[i].a == j)//如果此时的值等于j的话,则该数可以选
    			dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1);//如果data[i].a等于j说明,填表法。
    		}
    	for (int i = 1; i <= n; i++
    	)
    		for (int j = 1; j <= i; j++)
    			ans = max(dp[i][j], ans);
     	printf("%d", ans);
     	return 0;
    }
    /*
    10 
    1 1 3 3 1 6 4 6 5 10 
    */
    
  • 相关阅读:
    《计算机网络》总结
    【操作系统】死锁
    【操作系统】进程同步
    【操作系统】处理器调度
    【操作系统】总结二(进程与线程)
    【操作系统】总结一
    前缀、中缀、后缀表达式
    QMap
    Qt 常用的功能
    Qt 文件处理
  • 原文地址:https://www.cnblogs.com/liuwenyao/p/11670278.html
Copyright © 2011-2022 走看看