20:14:09 2011-05-19 题意:求最长递减序列 思路:动态规划。dp[i] = max(dp[i],dp[j]+1|dp[i]<dp[j],0<j<i); 代码: #include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <cstring> #include <cstdlib> using namespace std; vector<int> hei; int max(int a, int b) { return (a > b ? a : b); } int main(void) { int test = 1; int d; while(true) { scanf("%d",&d); if(d<0) break; hei.push_back(d); while(scanf("%d",&d) != EOF && d>=0) { hei.push_back(d); } int len = hei.size(); int i,j; vector <int> dp(len+1,1); for(i=1; i<len; i++) { for(j = 0; j<i; j++) { if(hei[i]<hei[j]) dp[i] = max(dp[i],dp[j]+1); } } int mm = 1; for(i=0; i< len; i++) if(mm < dp[i]) mm = dp[i]; printf("Test #%d:/n",test++); printf(" maximum possible interceptions: %d/n/n",mm); while(!hei.empty()) hei.pop_back(); } return 0; }