題目:https://vjudge.net/contest/68966#overview
HDU - 1029
題意:找出出現次數超過一半的數字
蠢思路:排序找中間
DP:掃一遍一個變量count記錄解出現的次數,是當前解就++,否則--,count為負就換掉當前解。(解釋:想象解全都挨在一起(前面),count先達到最大,然后減為1或0,而其他數字先出現,可能會使正確解的count減為負數,但都會使正確解在后面更多,從而保證了結束時肯定為正確解)代碼拿來
?
//在代碼可讀性較好的前提下才追求代碼簡潔,所以沒有縮哦
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{int n;while(scanf("%d",&n)!=EOF){int temp,k=0;int count=0;while(n--){scanf("%d",&temp);if(temp==k)count++;else{count--;if(count<0){count=0;k=temp;}}}printf("%d\n",k);}
}
HDU 1087
題意:找遞增子序列的最大和
思路:和最長遞增子序列類似,只是dp[i]=max(之前的)+第i個數的值。
?
HDU - 1176?
題意:略,百度原題自己看
思路:dp[t][x] ?表示第t秒第x個位置上有餡餅掉落,把所有餡餅都填入表,從底往上走,走到最上面,求經過和最大。
注:剛開始想不到是這種題,還是思維不夠開啊,用二維表示時間和一維空間,很巧妙。(萌新跳轉https://blog.csdn.net/hebtu666/article/details/79964233第二題)
?
HDU - 1257?
題意:就是求一個最長上升子序列啊
解釋:對于這個最長上升子序列而言,每一個數代表一個攔截系統的最小值,并且由于序列是上升的,每一個數都不能再攔截序列中的下一個數,因為下一個數更大,因此這個子序列的長度就是攔截系統數。
注:我原來以為是找最長下降子序列并對剩下的數遞歸,直到沒有數字,看有幾個序列。是我腦子不夠活。
?poj-1458
最長公共子序列
經典題
核心代碼
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if(str1[i-1]==str2[j-1]) dp[i][j]=dp[i-1][j-1]+1;?
?
?
?