USCACO Buy Low, Buy Lower
生活随笔
收集整理的這篇文章主要介紹了
USCACO Buy Low, Buy Lower
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
求最長(zhǎng)下降子序列簡(jiǎn)單,難點(diǎn)就是求序列的個(gè)數(shù)更難的就說處理重復(fù)序列。求個(gè)數(shù)代碼還好理解判斷重復(fù)就是從那個(gè)數(shù)字一直往前找如果找到一個(gè)和它相等的(假設(shè)這兩個(gè)數(shù)字為ab),看看這兩個(gè)數(shù)字之間有沒有可以和后面數(shù)字既b組成序列的如果沒有(dp[i]==1)這兩個(gè)就相當(dāng)于一個(gè)數(shù)字。那么就使這個(gè)數(shù)的cnt【i】=0用一會(huì)不用計(jì)算這個(gè)數(shù)字。
然后再用大數(shù)字處理兩個(gè)數(shù)之間的加就行了。
/*
ID:jinbo wu
TASK: buylow
LANG:C++
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[5500];
string cnt[5500];
int dp[5500];
string add(string str1,string str2)
{string str;int len1=str1.length();int len2=str2.length();if(len1>len2){for(int i=0;i<len1-len2;i++)str2="0"+str2;}else{for(int i=0;i<len2-len1;i++)str1="0"+str1;}int temp,cf=0;for(int i=str1.length()-1;i>=0;i--){temp=str1[i]-'0'+str2[i]-'0'+cf;cf=temp/10;temp=temp%10;str = char(temp+'0')+str;}if(cf)str = char(cf+'0')+str;return str;
}
int main()
{freopen("buylow.in","r",stdin);freopen("buylow.out","w",stdout);int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];dp[i]=1;cnt[i]="1";}for(int i=1;i<=n;i++){for(int j=i-1;j>=1;j--){if(a[i]<a[j]){if(dp[i]<dp[j]+1){dp[i]=dp[j]+1;cnt[i]=cnt[j];}else if(dp[i]==dp[j]+1)cnt[i]=add(cnt[i],cnt[j]);}else{if(a[i]==a[j]){if(dp[i]==1)cnt[i]="0";break;}}}}int maxlen=0;for(int i=1;i<=n;i++){maxlen=max(dp[i],maxlen);}string ans="0";for(int i=1;i<=n;i++){if(dp[i]==maxlen)ans=add(ans,cnt[i]);}cout<<maxlen<<" "<<ans<<endl;}
總結(jié)
以上是生活随笔為你收集整理的USCACO Buy Low, Buy Lower的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杜蕾斯多少钱啊?
- 下一篇: usaco street race(df