锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 棰樻剰錛?span style="font-size: 10pt; ">鏈?/span>3涓漢 姣忎釜浜烘湁n涓壒寰佸?/span>(1 ≤ n ≤ 4 000) 姹傛瘡涓漢閮芥湁鐨勭壒寰佸兼湁鍑犱釜錛?/span>(鐗瑰緛鍊?/span> ≤ 10^9) 鍒嗘瀽錛氭垜鎶婃墍鏈夌殑鏁版嵁鏀懼埌涓涓暟緇勯噷鎺掑簭錛屾湁榪炵畫涓変釜鐩稿悓鐨勮瘽灝辨槸涓涓叡鍚岀壒寰併?br />
#include<cstdio>
#include<algorithm>
using namespace std;
int arr[12003];
int main()
{
int n;
scanf("%d",&n);
int i;
for(i=0;i<n;++i)
{
scanf("%d",&arr[i]);
}
scanf("%d",&n);
n+=i;
for(;i<n;++i)
{
scanf("%d",&arr[i]);
}
scanf("%d",&n);
n+=i;
for(;i<n;++i)
{
scanf("%d",&arr[i]);
}
sort(arr,arr+n);
int cnt=0;
for(int j=0;j<n-2;++j)
{
if(arr[j]==arr[j+1]&&arr[j+1]==arr[j+2])
{
++cnt;
}
}
printf("%d\n",cnt);
return 0;
}
棰樻剰錛?/span>k涓烘瘡鍒嗛挓鍙互閫氳鐨勬渶澶ц濺杈嗐備竴鍏辨湁n涓垎閽燂紝緇欏嚭姣忓垎閽熸柊鍑虹幇鐨勮濺杈嗘暟錛岄棶榪囦簡n鍒嗛挓鍚庤繕鍓╀笅澶氬皯杈嗚濺娌℃湁閫氳銆?/span>
鍒嗘瀽錛氱洿鎺ユā鎷熷氨鍙互浜嗐?br />
寰堥仐鎲炬瘮璧涚殑鏃跺欐病鍋氬嚭鏉ワ紝褰撴椂鐢ㄨ椽蹇冪殑鏂規硶鍐欒繃錛屽彲鏄濊礬鏈夐棶棰橈紝WA浜嗐傝В棰樻姤鍛婁笂闈㈠彧璇存槸璐績錛屼絾鍏蜂綋鎬庝箞鍐欐病鏈夎銆備簬鏄垜灝卞皾璇曚簡涓浜涜椽蹇冩兂娉曪紝緇堜簬AC銆?4ms鐨勬椂闂磋繕鎸洪潬鍓嶇殑銆?/span>
棰樻剰錛歂涓侀紶媧炲拰N涓侀紶錛岃侀紶鏈変釜鍏磋叮鍖洪棿[s,t]錛屽氨鏄鑰侀紶浼氬榪欎釜鑼冨洿鍐呯殑媧炴劅鍏磋叮錛屼粬浠細鍗犻鑷繁鎰熷叴瓚g殑媧炪傛湁涓涓叴瓚f嘗鍔ㄨ寖鍥碖錛屾眰涓涓渶灝忕殑K浣垮緱鎵鏈夌殑鑰侀紶閮借兘鍗犻鑷繁鎰熷叴瓚g殑媧炪?/p>
鍒嗘瀽錛氭寜鐓у乏杈瑰尯闂翠粠灝忓埌澶ф帓搴忥紝鐒跺悗寮濮嬫灇涓炬瘡涓涓尯闂達紝浠庡尯闂村彸杈圭殑绔偣寮濮嬫斁錛屽鏋滈偅涓綅緗凡緇忔湁鑰侀紶鐨勮瘽錛屽氨鍚戝墠閬嶅巻涓閬嶇湅鍓嶈竟鐨勬礊鏄惁宸叉弧錛屾病鏈夋弧鐨勮瘽灝卞悜鍓嶉亶鍘嗭紝閬囧埌宸︾鐐圭殑鍊煎皬浜庤繖涓侀紶鐨勫乏绔偣鍊兼椂錛屽氨浜ゆ崲錛岀洿鍒伴亣鍒頒竴涓┖媧炪傚鏋滄弧浜嗙殑璇濆氨鍚戝悗閬嶅巻錛岄亣鍒板彸绔偣澶т簬榪欎釜鑰侀紶鐨勫彸绔偣鏃訛紝灝變氦鎹紝鐩村埌閬囧埌涓涓┖媧炪傞亶鍘嗙殑鏃跺欒鏃跺埢鍒ゆ柇K鐨勫鹼紝濡傛灉鍒拌揪涓嶄簡閭d釜鑼冨洿錛屽氨澧炲ぇK鐨勫箋?br />
鍖洪棿鍚堝茍鐨勭嚎孌墊爲棰橈紝涔熸槸鎴戠殑絎竴涓尯闂村悎騫躲?/span>
棰樻剰錛堣漿錛夛細Bessie絳夌墰鍒板姞鎷垮ぇ鐨勬寰瘋礉鍘誨闀挎枃鍖栦慨鍏誨甯﹁璧忚嫃蹇呭埄灝旀箹鐨勯槼鍏夈傛寜鐓у娓哥殑浠嬬粛錛?/span>Bessie閫夋嫨浜嗚憲鍚嶇殑Cumberland澶ц涓婄殑Bullmoose瀹鵑浣滀負灞呬綇鐨勫湴鐐廣?/span>
榪欏駭宸ㄥ瀷瀹鵑鍦ㄤ竴鏉¤秴闀胯蛋寤婁笂鏈?/span>N錛?/span>1 ≤ N ≤ 50000錛変釜鎺掓垚涓鎺掔殑鎴塊棿錛屾瘡涓埧闂撮兘鑳芥璧忓埌鑻忓繀鍒╁皵婀栫殑濂芥櫙鑹層傜幇鍦ㄦ墍鏈夌殑鎴塊棿閮芥槸絀虹殑銆?/span>
鐜板湪Bessie絳夋梾瀹滑姝e湪涓嶆柇鍦板彂鍑鴻鎴垮拰閫鎴胯姹傘備綘闇瑕佹帴鍙?/span>M錛?/span>1 ≤ M < 50000錛夋潯鎸囦護錛?/span>
姣忔潯鎸囦護鐨勭涓涓暟瀛椾負1鎴?/span>2銆傚鏋滄槸1錛屽悗闈㈠皢鏈変竴涓暣鏁?/span>D琛ㄧず欏懼瑕侀瀹氱殑鎴塊棿鏁般傛敞鎰忥紝榪欎簺鎴塊棿蹇呴』鏄繛緇殑銆傚鏋滆兘澶熸弧瓚蟲梾瀹㈢殑璁㈡埧瑕佹眰錛岃緭鍑烘弧瓚寵姹傜殑絎竴涓埧闂寸殑緙栧彿錛堜緥濡傦紝瑕佽鎴?/span>6闂達紝杈撳嚭3琛ㄧず3, 4, 5, 6, 7, 8鏄弧瓚寵姹傜殑錛夛紝榪欐牱鐨勭紪鍙峰繀欏繪槸鍙兘鐨勭紪鍙烽噷闈㈡渶闈犲墠鐨勩傚鏋滀笉鑳芥弧瓚寵姹傦紝杈撳嚭0銆?/span>
濡傛灉鏄?/span>2錛屽悗闈㈠皢鏈変袱涓暣鏁?/span>X鍜?/span>D琛ㄧず欏懼瑕侀鎺?/span>X, X + 1, X + 2, ... , X + D - 1榪?/span>D闂存埧銆傚浜庤繖鏍風殑鎸囦護浠涔堥兘涓嶈緭鍑恒?/span>
鍒嗘瀽錛?/span>
鍒嗗埆鐢?/span>lsum錛?/span>rsum鍜?/span>msum琛ㄧず鍖洪棿宸﹁竟鏈澶ц繛緇埧闂存暟錛屽尯闂村彸杈規渶澶ц繛緇埧闂存暟鍜屽尯闂存渶澶ц繛緇埧闂存暟銆?/span>
鏌ヨ鐨勬椂鍊欙紝鍏堟壘宸﹀効瀛愭槸鍚﹁凍澶燂紝鐒跺悗濡傛灉涓嶅灝辨壘宸﹀効瀛愮殑鍙沖尯闂村拰鍙沖効瀛愮殑宸﹀尯闂寸殑鍜屾槸鍚﹁凍澶燂紝濡傛灉涓や釜閮戒笉澶熺殑璇濆氨鎵懼彸鍎垮瓙錛堣繖涓椂鍊欏彸鍎垮瓙灝辮偗瀹氭弧瓚充簡錛夈?/span>
鏌ヨ緇撴潫鏃惰鎶婅繖涓尯闂寸殑鎴垮瓙鏇存柊鎴愬凡浣忋?/span>
鏇存柊鐨勬椂鍊欏拰鏅氱殑綰挎鏍戣妭鐐規洿鏂版槸涓鏍風殑錛屼笉鍚岀殑鏄湪鏇存柊瀹屽瓙鑺傜偣鍚庯紝瑕佹妸瀛愯妭鐐圭殑淇℃伅鍙嶉鍒扮埗鑺傜偣涓?/span>
鍦?/span>NYOJ涓彁浜?/span>TLE錛屽師鍥犲眳鐒舵槸瀹忓畾涔夋瘮inline蹇?br />
#include<cstring>
#include<cctype>
#include<cstdio>
#include<algorithm>
using namespace std;
//娌℃兂鍒版垜鎶奿nline鎹㈡垚瀹忓畾涔夊悗灝盇C浜嗭紝鐞嗚涓婅繖涓や釜涓鏍風殑錛屼絾鏄痠nline鐨勭粨鏋滃嵈鏄疶LE
#define L(r) r<<1
#define R(r) r<<1|1
//inline int MID(int l,int r){return (l+r)>>1;}
//inline int L(int r){return r<<1;}
//inline int R(int r){return r<<1|1;}
const int MAXM=50005;
typedef struct
{
int lsum,rsum,msum;//鍒嗗埆琛ㄧず宸﹁竟鏈澶ф埧闂存暟錛屽彸杈規渶澶ф埧闂存暟錛屾暣浣撴渶澶ф埧闂存暟
int cover;//鏄惁浣忎笅
}node;
node tree[MAXM<<2];
void pushDown(int root,int m)//鍚戜笅鏇存柊
{
if(tree[root].cover==-1) return;//鏄惁宸茬粡鏇存柊
tree[L(root)].cover=tree[R(root)].cover=tree[root].cover;
tree[L(root)].msum=tree[L(root)].lsum=tree[L(root)].rsum=tree[root].cover?0:m-(m>>1);
tree[R(root)].msum=tree[R(root)].lsum=tree[R(root)].rsum=tree[root].cover?0:(m>>1);
tree[root].cover=-1;
}
void pushUp(int root,int m)//鍚戜笂鏇存柊
{
tree[root].lsum=tree[L(root)].lsum;
tree[root].rsum=tree[R(root)].rsum;
if(tree[root].lsum==m-(m>>1) ) tree[root].lsum+=tree[R(root)].lsum;
if(tree[root].rsum==(m>>1) ) tree[root].rsum+=tree[L(root)].rsum;
tree[root].msum=max(tree[R(root)].lsum+tree[L(root)].rsum,max(tree[L(root)].msum,tree[R(root)].msum) );
}
void Create(int l,int r,int root)//寤烘爲榪囩▼
{
tree[root].cover=-1;
tree[root].lsum=tree[root].rsum=tree[root].msum=r-l+1;
if(l==r){return;}
int mid=(l+r)>>1;
Create(l,mid,L(root));
Create(mid+1,r,R(root));
}
void update(int ll,int rr,int c,int l,int r,int root)//鏇存柊
{
if(ll<=l&&r<=rr)//濡傛灉鎵懼埌榪欎釜鑼冨洿灝辯洿鎺ヨ祴鍊艱繑鍥烇紝涓嶅悜涓嬬戶緇洿鏂?/span>
{
tree[root].msum=tree[root].lsum=tree[root].rsum=c?0:r-l+1;
tree[root].cover=c;
return;
}
pushDown(root,r-l+1);//鐢ㄥ埌榪欎釜鑺傜偣鐨勫瓙鑺傜偣鐨勬椂鍊欏氨鍚戜笅鏇存柊
int m=(l+r)>>1;
if(ll<=m) update(ll,rr,c,l,m,L(root));
if(m<rr) update(ll,rr,c,m+1,r,R(root));
pushUp(root,r-l+1);//鍚戜笅鏇存柊瀹屽悗闇瑕佹妸鑺傜偣淇℃伅鍙嶉緇欑埗鑺傜偣
}
int query(int w,int l,int r,int root)//鏌ヨ婊¤凍榪炵畫鎴塊棿鏁伴噺鐨勬渶宸﹁妭鐐?/span>
{
if(l==r) return l;
pushDown(root,r-l+1 );//鐢ㄥ埌榪欎釜鑺傜偣鐨勫瓙鑺傜偣鐨勬椂鍊欏氨鍚戜笅鏇存柊
int m=(l+r)>>1;
if(tree[L(root)].msum>=w) return query(w,l,m,L(root));//濡傛灉宸﹀効瀛愭弧瓚沖氨璇㈤棶宸﹀効瀛?/span>
else if(tree[L(root)].rsum+tree[R(root)].lsum>=w) return m-tree[L(root)].rsum+1;//濡傛灉宸﹀効瀛愬拰鍙沖効瀛愪箣闂寸殑鏁伴噺婊¤凍錛屽垯鑼冨洿宸﹀効瀛愬彸杈硅繛緇埧闂寸涓涓殑緙栧彿
return query(w,m+1,r,R(root));//濡傛灉涓よ呴兘涓嶆弧瓚沖垯璇㈤棶鍙沖効瀛?/span>
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,m;
while(~scanf("%d %d",&n,&m))
{
Create(1,n,1);
int a,num,x,d,p;
for(int i=0;i<m;++i)
{
scanf("%d",&a);
if(1==a)
{
scanf("%d",&num);
if(tree[1].msum<num) puts("0");//濡傛灉鏁翠釜鍖洪棿鐨勬渶澶ц繛緇埧闂存暟閲忓皬浜庨瀹氱殑鏁伴噺灝辮緭鍑?
else
{
p=query(num,1,n,1);//鎵懼埌鏈宸﹁妭鐐筽
printf("%d\n",p);
update(p,p+num-1,1,1,n,1);//鎶婂凡緇忔湁浜虹殑鎴塊棿鏍囪涓涓?/span>
}
}
else
{
scanf("%d %d",&x,&d);
update(x,x+d-1,0,1,n,1);//鎶婃鑼冨洿鐨勬埧闂存爣璁版垚鏃犱漢
}
}
}
return 0;
}
榪欓亾棰樻湁涓ょ瑙f硶錛?/span>
絎竴縐嶏細姹?/span>s鍜?/span>~s鐨?/span>LCS錛岀劧鍚庡鐢ㄥ叕寮?/span>length-LCS闀垮害 鍗充負鎵姹傘?/span>
絎簩縐嶏細鐩存帴DP姹傝В銆?/span>
褰?/span>s[i] == s[j]鏃?/span>
榪欎釜棰樻垜鐢ㄧ殑鏄竴涓ぇ鍨嬬殑浜岀淮鏁扮粍錛屼唬鐮佸緢姘達紝涓嶅緩璁璧忋?/span>
棰樻剰(杞?/span>)錛氬皢鏌愪簺鑺辨斁鍏ユ煇浜涜姳鐡朵腑寰楀埌鐨勮璧忎環鍊兼槸涓嶅悓鐨勶紝騫朵笖瑕佹眰寮濮嬭緭鍏ョ殑鏁版嵁蹇呴』鍦ㄥ悗杈撳叆鐨勬暟鎹墠闈€傚嵆:鑻ヤ竴鍙瘋姳鏀懼叆浜?/span>3鍙瘋姳鐡訛紝閭d箞鍚庨潰鐨勮姳灝變笉鑳芥斁鍏?/span>1錛?/span>2鍙瘋姳鐡朵簡銆?/span>
鍒嗘瀽錛氱畝鍗?/span>DP銆?/span>Dp[i][j]琛ㄧず鍓?/span>i鏈佃姳鎸夐『搴忔斁鍏ュ墠j 涓姳鐡朵腑鐨勬渶浼樿璧忎環鍊箋?/span>
鐘舵佽漿縐繪柟紼嬶細dp[i][j]=max(dp[i][j-1],dp[i-1][j-1]+map[i][j])
鍓?/span>i鏈佃姳鎸夐『搴忔斁鍏ュ墠j 涓姳鐡朵腑鐨勬渶浼樿璧忎環鍊?/span>=max錛堝墠i鏈佃姳鎸夐『搴忔斁鍏ュ墠j -1涓姳鐡朵腑鐨勬渶浼樿璧忎環鍊鹼紝鍓?/span>i-1鏈佃姳鎸夐『搴忔斁鍏ュ墠j -1涓姳鐡朵腑鐨勬渶浼樿璧忎環鍊?/span>+絎?/span>i鏈佃姳鏀懼叆j鐡朵腑鐨勪環鍊鹼級
娉ㄦ剰浠峰煎彲鑳戒負璐熸暟銆?br />
絎竴嬈?/span>WA錛屽彂鐜拌緭鍑烘牸寮忎笉瀵癸紝鏀規帀銆?/span>
絎簩嬈?/span>WA錛屽緇撴灉鐩哥瓑鐨勬儏鍐墊病鏈夎冭檻錛屾敼鎺夈?/span>
絎笁嬈?/span>AC銆?/span>
棰樻剰鍜岄瑙h榛戜功P13銆?/span>
闇瑕佹敞鎰忕殑鏄鏋氫婦浠庣涓涓箹璧板埌鏈鍚庝竴涓箹鐨勬瘡涓縐嶆儏鍐碉紝瀵圭粨鏋滅浉絳夎繖縐嶆儏鍐靛仛鐗規畩澶勭悊銆?br />
棰樻剰錛氬棣嗘湁涓彲浠ヤ幾緙╃殑闂紝姣忕閽熷彲浠ヤ幾闀?/span>1涓崟浣嶏紝鎴栬呯緝灝?/span>1涓崟浣嶏紝鎴栬呭師鍦頒笉鍔ㄣ傛湁N涓己鐩楋紝姣忎釜寮虹洍浼氬湪t鐨勬椂闂村唴鍒拌揪騫舵寜錛屽鏋滄鏃墮棬鐨勫紑鏂瑰害鍜屼粬鐨勮韓鏉?/span>s姝eソ鐩哥瓑錛岃繖涓己鐩楀氨浼氳繘鏉ワ紝鐒跺悗浣犲氨鑳藉緱鍒?/span>p鐨勫姞鍒嗐?/span>
鍒濆鐘舵侀棬鏄叧闂殑錛岃浣犳眰鍑哄湪t鏃跺埢寰楀埌鐨勬渶澶у緱鍒嗐?/span>
鍒嗘瀽錛氭寜鏃墮棿浠庡皬鍒板ぇ鎺掑簭錛?/span>t鏃墮棿鍐呮渶澶х殑寰楀垎鐢?/span>t涔嬪墠鐨勬椂鍒誨喅瀹氾紝婊¤凍鏃犲悗鏁堟э紝姣忎竴涓椂鍒婚兘鑳藉緱鍒版渶浼樿В錛屾弧瓚蟲渶鏈夊瓙緇撴瀯錛屾墍浠?/span>DP銆?/span>
F[i]琛ㄧず絎?/span>i涓漢銆?/span>
褰撹韓鏉愪箣宸皬浜庢椂闂翠箣宸椂F[i]=max(f[i],f[j]+ple[i].p) 0<=j<i 浣嗗緱婊¤凍涓涓潯浠訛紝絎?/span>j涓漢宸茬粡榪涘幓錛屽惁鍒欓棬浼擱暱鐨勫搴﹀彲鑳戒細灝忎簬韜潗銆?br />
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXM=103;
typedef struct People
{
int t,p,s;
}People;
People ple[MAXM];
int f[MAXM];
bool cmp(People p1,People p2)
{
return p1.t<p2.t;
}
int main()
{
int n,k,s;
scanf("%d %d %d",&n,&k,&s);
for(int i=1;i<=n;++i)
scanf("%d",&ple[i].t);
for(int i=1;i<=n;++i)
scanf("%d",&ple[i].p);
for(int i=1;i<=n;++i)
scanf("%d",&ple[i].s);
sort(ple+1,ple+n+1,cmp);
f[0]=0;
ple[0].p=0;ple[0].s=0;ple[0].t=0;
int ans=0;
for(int i=1;i<=n;++i)
{
for(int j=i-1;j>=0;--j)
{
if(f[j]>=ple[j].p)//涓嬩竴姝ュ仛宸殑鍩虹鏄j涓漢宸茬粡榪涘幓銆?/span>
if(abs(ple[i].s-ple[j].s)<=ple[i].t-ple[j].t)
f[i]=max(f[i],f[j]+ple[i].p);
}
ans=max(ans,f[i]);
}
printf("%d\n",ans);
return 0;
}
鐪嬩簡瑙i鎶ュ憡涔嬪悗鎴戝湪鎯籌紝涓轟粈涔堟垜浼氬偦鍌葷殑鍘繪妸姣忎竴澶╃殑楂樺害閮芥眰鍑烘潵銆傘傘傘?/span>
璇㈤棶鍝竴澶╁氨姹傚嚭鍝竴澶╃殑楂樺害錛屾妸澶╂暟鎺掍竴涓嬪簭鍙互鍦ㄦ眰鐨勮繃紼嬩腑鍒犳帀楂樺害鍜屽闀塊熷害閮藉皬鐨勬爲銆傛椂闂村鏉傚害<=O(m*n)銆?br />
姣旇禌鐨勬椂鍊欐墜鍐欑殑浜屽垎錛屾繪槸RE銆傝竟鐣屽鐞嗙殑鑳藉姏榪樻湁寰呭姞寮恒?/span>
鐪嬩簡瑙i鎶ュ憡涔嬪悗鎰熻鑷繁寮辯垎浜嗭紝鐭ラ亾鏂規硶鐨勯閮藉啓涓嶅嚭鏉ャ傝屼笖褰撴椂榪樻槸鐢ㄧ殑map鍐欑殑錛屾偛鍓х殑瓚呮椂浜嗐傛敼鐢?/span>vector灝辮繃浜嗐?/span>
鎶婃瘡涓暟瀛楀嚭鐜扮殑浣嶇疆瀛樺偍涓嬫潵錛岀劧鍚庡鎵姹傜殑浣嶇疆榪涜涓ゆ浜屽垎錛屽氨OK浜嗐傜敤鐨勬槸stl閲岀殑浜屽垎錛屾病鎯沖埌榪唬鍣ㄨ繕鍙互榪欐牱鐢ㄣ?br />
棰樻剰錛氭妸緇欏畾灝哄鐨勯暱鏂逛綋錛堟暟閲忎笉闄愶級鍙犲姞鍦ㄤ竴璧鳳紝鍙犲姞鐨勬潯浠舵槸錛屼笂闈竴涓暱鏂逛綋鐨勯暱鍜屽姣斾笅闈㈤暱鏂逛綋鐨勯暱鍜屽鐭紝涓嶈兘鐩哥瓑錛岄暱鏂逛綋鍙互浠繪剰闈㈡湞涓嬫憜鏀撅紝姹傝繖浜涢暱鏂逛綋鑳藉彔鍔犵殑鏈楂樼殑楂樺害銆?/span>
鎶婃瘡涓暱鏂逛綋鍒嗘垚3涓厓绱犮傜劧鍚庡氨鍜岀煩褰㈠祵濂楀樊涓嶅浜嗭紝鎺掑簭涔嬪悗姹傚閲忔渶澶х殑瀛愬簭鍒椼?br />
緇嗚妭娌℃湁澶勭悊濂斤紝瀵艱嚧瓚呮椂浜嗗ソ澶氭銆?/span>
瀵逛簬i鍜?/span>j涓棿鐨?/span>k錛屽鏋?/span>i鍜?/span>j鑳介亣瑙?/span>k錛?/span>i鑳芥墦璐?/span>k鎴栬?/span>j鑳芥墦璐?/span>k錛屽垯i灝辮兘閬囪j錛岀敤f[i][j]琛ㄧずi鍜?/span>j鏄惁鑳介亣瑙併傚鏋?/span>i鏈緇堣兘閬囪鑷繁錛岄偅涔?/span>i灝辨湁鍙栧緱鑳滃埄鐨勫彲鑳姐?/span>
娌℃湁寮澶ф暟緇勭殑蹇呰錛岀洿鎺ュ彇浣欏氨鍙互銆傚緱鐪嬫槑鐧介偅浜涙槸鏈浼樺瓙緇撴瀯錛屽惁鍒欎綘娌″姙娉?/span>DP銆?/span>
鏃墮棿澶嶆潅搴︿負O(n^3)
鍙堟槸鍛ㄤ紵澶х墰璁烘枃閲岀殑渚嬮銆傛浘緇忓仛榪囦竴涓彧鏈変袱琛岀殑棰橈紝寰堟按鐨?/span>DP銆傜煩闃靛姞澶у悗鐘舵佷篃澧炲姞浜嗗緢澶氾紝寰堣嚜鐒剁殑灝辯敤鍒頒簡鐘舵佸帇緙┿?/span>
浣嗘槸錛岀湅浜?/span>discuss涔嬪悗瑙夊緱鑷繁鍙堜竴嬈″急鐖嗕簡錛岄偅25琛岀殑浠g爜鍐欑殑閮芥槸紲為┈鍟婏紝鐪嬫潵鍙湁鑶滄嫓鐨勪喚浜嗐傝繕鏄厛鍐欏ソ鐘舵佸帇緙╁惂銆?/span>
璧峰垵鑷繁涓嶄細DFS錛岀湅浜嗘煇浣嶅ぇ鐗涚殑瑙i鎶ュ憡錛岀悊瑙d簡DFS騫朵笖琛ㄧず榪欎綅澶х墰鐨?/span>DFS鍐欑殑澶己澶т簡錛屽摝榪樻湁錛屽懆浼熷ぇ鐗涚殑璁烘枃澶己澶т簡錛屽摝榪樻病瀹岋紝鐘舵佸帇緙╁悗鐨勪簩榪涘埗琛ㄧず娉曞お寮哄ぇ浜嗭紝綆綆鍗曞崟鐨?/span>0鍜?/span>1灝辨妸鎵鏈夌殑鐘舵佸氨鎼炲畾浜嗐?/span>
鍙戠幇vector鍦ㄨ繖閲岀敤寰堝悎閫傘?/span>
澶х墰鍗氬鍦板潃錛?/span>http://www.shnenglu.com/sdfond/archive/2009/07/31/91761.html
闅劇偣錛?/span>1銆?/span>DFS瀵繪壘鐘舵佺殑榪囩▼銆?/span>2銆佺姸鎬佸悜涓婂嚫鍑哄拰鍚戜笅鍑稿嚭鐨勫鐞嗐?br />
寮辯垎浜嗐傛垜璋冭瘯浜嗕竴涓笅鍗堝姞鍗婁釜鏅氫笂錛屾渶鍚庨噸鍐欎簡涓閬?/span>AC浜嗐?/span>2xx ms鐨勬椂闂達紝鍦ㄨ嚜宸?/span>oj涓婃帓鍊掓暟絎竴銆?/span>
鎴戠殑絎簩閬撶姸鎬佸帇緙?/span>DP錛屼篃鏄懆浼熻鏂囥婄姸鎬佸帇緙┿嬮噷鐨勪竴閬撲緥棰橈紝鏍稿績鎬濇兂榪欑瘒璁烘枃鍒嗘瀽鐨勫緢娓呮錛屽緩璁涔犵姸鎬佸帇緙╃殑鍚屽涓瀹氳鐪嬩竴涓嬨?/span>
榪欓亾棰樺仛鐨勫緢榪囩樉錛屾敹鑾峰緢澶氾紝鍚勭浜岃繘鍒剁殑瑙f硶銆傝繕鏈夌姸灝辨槸鎬佹暟鐨勬眰娉曚篃寰堝己錛屽垰寮濮嬪啓鐨勬椂鍊欒繕鍑嗗DFS鍛紝鍚庢潵澶х墰鍛婅瘔鎴戠洿鎺ユ灇涓炬墍鏈夌姸鎬佽繘琛屽垹闄ゅ氨鍙互浜嗭紝濂藉惂錛屽垹闄ょ殑鍒ゆ柇鍙堟槸浜岃繘鍒躲?br />
絎竴涓姸鎬佸帇緙╁晩錛岃皟璇曚簡涓涓笂鍗堬紝緇堜簬榪囦簡錛屽浗鐜嬬殑涓暟鍘熸潵鏄粠0寮濮嬪驚鐜殑銆?/span>
鍛ㄤ紵澶х鐨勮鏂囥婄姸鎬佸帇緙┿嬪緢緇欏姏錛屽鏋滀笉鏄繖綃囪鏂囷紝鎴戦兘涓嶇煡閬撹濡備綍鍏ラ棬浜嗐傚搸錛屾病浜烘暀鐨勬澂鍏楓?/span>
鏈棰樿В銆婄姸鎬佸帇緙┿嬭鐨勫緢娓呮錛屾垜灝變笉澶氬簾璇濅簡銆傞渶瑕佹敞鎰忕殑鏄寖鍥翠細瓚?/span>int錛岃繕鏈夊鐘舵佺殑鑼冨洿瑕佹妸鎻″ソ錛屾悶涓嶅ソ浣犱篃瑕佹澂鍏峰幓鍚勭璋冭瘯浜嗐?/span>
鑷繁鍐欑殑DFS寰堟尗錛屽熺敤浜嗕笉鐭ラ亾鍝綅澶х墰鐨?/span>DFS銆?br />
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXM=520;
int n,k;
int s[MAXM];//鐘舵佹暟
int c[MAXM];//1鐨勪釜鏁?/span>
long long f[13][MAXM][103];
int ck;
void dfs(int x,int val,int cnt)//DFS瀵繪壘姣忚鐨勭姸鎬佹暟
{
if(x==n)
{
s[++ck]=val;
c[ck]=cnt;
return;
}
dfs(x+1,val<<1,cnt);
if(!(val&1))
dfs(x+1,val<<1|1,cnt+1);
}
bool cont(int s1,int s2)//鍒ゆ柇涓庨鎰忔槸鍚︾煕鐩?/span>
{
if(s1&s2) return false;//鍜屾涓婃柟鍒ゆ柇
if(s1&(s2<<1))return false;//鍜屽彸涓婃柟鍒ゆ柇
if(s1&(s2>>1))return false;//鍜屽乏涓婃柟鍒ゆ柇
return true;
}
void dp()
{
//鍒濆鍖栫姸鎬?/span>
memset(f,0,sizeof(f));
f[0][1][0]=1;
//dp
for(int i=1;i<=n;i++)
{
for(int j=1;j<=ck;j++)
{
for(int g=1;g<=ck;g++)
{
for(int p=0;p<=k;p++)
{
if((p-c[j]>=0)&&cont(s[j],s[g]))
f[i][j][p]+=f[i-1][g][p-c[j]];
}
}
}
}
}
int main()
{
while(scanf("%d %d",&n,&k)!=EOF)
{
ck=0;
dfs(0,0,0);
dp();
long long ans=0;
for(int i=1;i<=ck;++i)
{
ans+=f[n][i][k];
}
printf("%I64d\n",ans);
}
return 0;
}
澶ф剰錛氫袱涓瀭鐩翠簬x杞寸殑鐩寸嚎lx鍜?/span>rx鍥存垚鐨勫尯鍩熴傛湁n鏉$洿綰跨┛榪囪繖鐗囧尯鍩燂紝姣忔潯鐩寸嚎yi=kxi+b錛岀粰鍑?/span>k鍜?/span>b銆傛眰鐩寸嚎鎶婅繖涓尯鍩熷垎鎴愪簡鍑犱釜閮ㄥ垎銆備笁鏉$洿綰夸笉浼氫氦浜庝竴鐐癸紙鍖呮嫭錛氫袱涓瀭鐩翠簬x杞寸殑鐩寸嚎錛夈?/span>
鐢誨浘鍙互鎵懼嚭涓縐嶅叧緋伙紝鍒嗘垚鐨勫尯鍩熸暟=浜ょ偣鏁?/span>+綰挎鏁?/span>+1錛涘宸︾鐐逛粠澶у埌灝忔帓搴忥紝鐒跺悗瀵瑰彸绔偣姹傞嗗簭鏁幫紝閫嗗簭鏁板氨鏄氦鐐規暟錛岀嚎孌墊暟宸茬煡錛岀┖闂存暟灝卞嚭鏉ヤ簡銆?/span>
涓鐩磋涓烘槸浜岀淮綰挎鏍戯紝鐪嬩簡瑙i鎶ュ憡鍚庡眳鐒舵槸姘撮銆?/span>
鏈澶?/span>1000涓煩褰€傛瘡嬈℃壂鎻忕煩褰笌涔嬪墠鐨勭煩褰㈡槸鍚︾浉浜わ紝鍦ㄧ浉浜ょ殑鐭╁艦涓壘鍒頒竴涓渶澶х殑鍊?/span>max錛岃榪欎釜max鍔犱笂h灝辨槸榪欐鐭╁艦鐨勫箋傛瘡嬈″悜鍥炴壂鎻忎竴閬嶏紝鏈楂樹篃灝?/span>1000*1000鐨勬椂闂達紝1s鍐呯粷瀵規病闂銆?br />
#include<cstdio>
using namespace std;
typedef struct
{
int x1,y1,x2,y2,_max;
}Matrix;
Matrix matrix[1003];
bool cover(int i,int j)//鏄惁鐩鎬氦
{
if(matrix[i].x1>=matrix[j].x2||matrix[j].x1>=matrix[i].x2) return false;
if(matrix[i].y1>=matrix[j].y2||matrix[j].y1>=matrix[i].y2) return false;
return true;
}
int main()
{
int N,M,C;
while(scanf("%d %d %d",&N,&M,&C)!=EOF)
{
int ans=0;
int a,b,h,x,y;
for(int i=0;i<C;i++)
{
int tmax=0;
scanf("%d %d %d %d %d",&a,&b,&h,&x,&y);
matrix[i].x1=x;
matrix[i].y1=y;
matrix[i].x2=x+a;
matrix[i].y2=y+b;
for(int j=i-1;j>=0;j--)
{
if(cover(i,j))
{
tmax=max(tmax,matrix[j]._max);
}
}
matrix[i]._max=tmax+h;
ans=max(ans,matrix[i]._max);
}
printf("%d\n",ans);
}
return 0;
}
榪欓亾棰樼籂緇撴垜浜嗕竴澶╃殑鏃墮棿錛屾湰浠ヤ負鐢?/span>lowbit鍙互杞繪澗鎼炲畾錛屽彲鏄腑闂村嚭鐜頒簡鍚勭鏁呴殰錛?/span>WA浜嗗緢澶氭鎵?/span>AC銆?/span>
璁$畻a鍜?/span>b涔嬮棿鐨勮妭鐐規暟錛屽彲浠ョ敤1-a涓?/span>1-b鐨勮妭鐐規暟涔嬪樊鏉ユ眰銆傚湪鍙沖瓙鏍戠殑鐐瑰彲浠ヨ漿鍖栦負鐩稿簲鐨勫乏瀛愭爲鐨勭偣錛岀粡榪囧姝ラ鐨勮漿鍖栵紝鍙互鎶婄偣鐨勪綅緗浐瀹氬湪鏍戠殑鏈宸﹁竟鐨勯偅鏉$嚎涓娿傛墍浠ュ彧闇瑕佽綆楁瘡灞傛渶宸﹁竟鐨勮妭鐐規暟灝?/span>OK浜嗐傜粡榪囬掓帹浼氬緱鍑轟竴涓叕寮忥紝z[i]=z[i-1]*2+i-1;i琛ㄧず鏍戠殑楂樺害銆?br />
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
ll z[33]={0};//浠?鍒皀緇忚繃鐨勭偣
ll d[33]={0};//鏍戞瘡灞傛渶宸﹁竟鐨勫簭鍙?/span>
void init()
{
for(int i=2;i<=31;i++)
{
z[i]=z[i-1]*2+i-1;
}
d[1]=1;
for(int i=2;i<=31;i++)
{
d[i]=d[i-1]<<1;
}
}
ll lowbit(ll x)
{
return x&(-x);
}
//寰楀埌鏁扮殑浜岃繘鍒朵綅鏁?/span>
ll getbit(ll x)
{
ll cnt=0;
while(x!=1)
{
x>>=1;
cnt++;
}
return cnt;
}
void swap(int& a,int& b)
{
int temp=a;
a=b;
b=temp;
}
ll fun(ll x)
{
return d[getbit(x)+1];//寰楀埌浣嶆暟瀵瑰簲鐨勪簩榪涘埗鏁?/span>
}
ll solve(ll x)
{
ll bx=x-lowbit(x);
if(bx==0)
{
return z[getbit(x)];
}
else
{
int temp=fun(x);
ll sum=solve(temp)+abs(solve(temp)-solve(temp-(x-temp)));
return sum;
}
}
int main()
{
init();
int a,b;
while(scanf("%d %d",&a,&b)!=EOF)
{
if(a>b) swap(a,b);
ll ba=solve(a);
ll bb=solve(b);
printf("%lld\n",bb-ba);
}
return 0;
}
姘撮銆?/span>
棰樻剰錛氱粰浣犳瘡澶╃殑鑲′環錛岃浣犳壘鍑烘渶灝忕殑K1涓偂浠鳳紝鐒跺悗鎸夋棩鏈熶粠灝忓埌澶ф帓搴忚緭鍑猴紝鎵懼嚭鏈澶х殑k2涓偂浠鳳紝鎸夋棩鏈熶粠澶у埌灝忚緭鍑恒?/span>
鎴戠敤浜?/span>4涓?/span>sort銆?br />
DP鎴栧崱鐗瑰叞鏁?span style="font-family:瀹嬩綋;">銆?/span>
寮辯垎浜嗐傚仛棰樼殑鏃跺欏彧鎯崇潃鐢ㄤ竴涓姸鎬佸幓鍋氾紝緇撴灉鎮插墽浜嗐傚悗鏉ユ垚鍝ユ彁閱掔敤浜岀淮鐨勶紝鎴戞墠鍙戠幇寰楃敤涓や釜鐘舵佸幓鍐欍傚搸錛屾庝箞娌℃兂鍒頒袱涓姸鎬佸憿銆?br />棰樻剰錛氬湪涓涓摱瀛愰噷鏈塏鐗囪嵂錛屾瘡嬈″悆鍗婄墖錛屼粠鐡跺瓙閲屽彲鑳芥嬁鍑烘暣鐗囷紝涔熷彲鑳芥嬁鍑哄崐鐗囷紝濡傛灉鎷垮嚭鏁寸墖錛岃涓篧錛屽崐鐗囪涓篐銆傞棶鏈夊灝戠鎺掑垪銆?/span>
絎竴涓姸鎬侊細瀹屾暣鑽墖鐨勬暟閲忋傜浜屼釜鐘舵侊細鍗婄墖鑽墖鐨勬暟閲忋?/span>
F錛?/span>i錛?/span>j錛?/span>=f錛?/span>i-1,j+1錛?/span>+f錛?/span>I錛?/span>j-1錛夛紱
褰撳悆鐨勬槸鏁寸墖鏃訛紝i-1錛屽崐鐗囩殑澧炲姞涓涓紝j+1銆?/span>
褰撳悆鐨勬槸鍗婄墖鏃訛紝i涓嶅彉錛?/span>j-1銆?/span>
鐢ㄤ袱涓姸鎬佸啓鐨勬椂鍊欒繖涓灝卞緢姘翠簡銆備笉榪囨彁浜ょ殑鏃跺欏湪g++涓嬬敤lang lang WA錛屾敼鎴?/span>int64鍦?/span>C++涓嬫彁浜ゅ氨AC浜嗐傚緢鏄笉瑙c?br />
鍗$壒鍏版暟鐨勬柟娉曞氨涓嶅璇翠簡銆傘傘傘備綘鎳傜殑銆傘?/span>
棰樼湅涓嶆噦錛屽湪緗戜笂鎵懼埌鐨勭炕璇戙傚氨鏄暣涓覆錛堜笉鏄暣琛岋級鐨勭害鐟熷か鐜?br />
棰樼洰淇濊瘉鑷沖皯鏈変竴涓?/span>1銆?/span>2銆?/span>3銆?/span>4銆傝鏄庤繖鍥涗釜鏁版槸涓涓獊鐮寸偣銆傜敱姝ゅ彲浠ヨ仈鎯沖埌浠?/span>1銆?/span>2銆?/span>3銆?/span>4鍥涗釜鏁板瓧緇撳熬鐨勬暟淇濊瘉鑳借7鏁撮櫎銆傝繖鏍蜂笉璁哄墠杈圭殑鏁版庢牱鎺掑垪錛屽悗杈瑰洓涓暟鎬繪湁涓縐嶇粍鍚堣兘澶熶繚璇佹暣浣撳彲浠ヨ7鏁撮櫎銆?br />
綆鍗曟暟瀛︺?/span>
棰樻剰鏄粰瀹氶暱鍜屽錛屾眰瀵硅綰跨孩鑹插尯鍩熺殑闀垮害鍜屻?/span>
鎶?/span>m,n閮介櫎浠ヤ粬浠殑鏈澶у叕綰︽暟t錛屼嬌tm=m/t,tn=n/t錛屾柊tm錛?/span>tn鎵緇勬垚鐨勭煩褰㈢殑瀵硅綰塊暱搴?/span>*t灝辨槸鍘熺煩褰㈢殑瀵硅綰塊暱搴︺?/span>
鎶婂瑙掔嚎騫沖潎鍒嗘垚tm*tn鏉$嚎孌碉紝瀵硅綰夸笌姣忔潯綰挎鐨勪氦鐐瑰繀鍦?/span>tm*tn浠戒腑鐨勭嚎孌電殑绔偣涓婏紙鍙埄鐢ㄧ浉浼間笁瑙掑艦璇佹槑錛岃繖閲岀渷鐣ワ級銆?/span>
瑙傚療鍙互鐪嬪嚭濡傛灉tm鍜?/span>tn鏈変竴涓槸鍋舵暟錛屽垯綰㈣壊綰挎鐨勬暟閲忓拰钃濊壊綰挎鐨勬暟閲忕浉絳夛紝濡傛灉tm鍜?/span>tn閮芥槸濂囨暟錛屽垯綰㈣壊綰挎鐨勬暟閲?/span>=钃濊壊綰挎鐨勬暟閲?/span>+1錛岃繖鏍鋒牴鎹瘮渚嬪氨鍙互姹傚嚭綰㈣壊綰挎鐨勯暱搴︿簡銆?br />
宸у鏁扮粍鎴栬呬竴緇寸嚎孌墊爲銆?br />姣旇禌鏃舵病鏈変粩緇嗙湅棰橈紝緇撴潫鏍囪鍐欓敊浜嗭紝瀵艱嚧TLE浜嗕袱嬈°傚ぇ鑷存剰鎬濇槸錛岀嚎孌墊爲闀垮害[0,len]錛屽垵濮嬪寲涓?/span>0錛屾彃鍏ュ尯闂村閲忥紝鏈鍚庢眰涓や釜鏈澶у肩殑浣嶇疆錛屼竴涓槸浠庡乏鍒板彸鐨勬渶澶у鹼紙閬囧埌鐨勭涓涓渶澶у煎嵆涓烘墍姹傦級錛屼竴涓槸浠庡彸鍒板乏鐨勬渶澶у箋?br />濂介暱鏃墮棿娌″啓綰挎鏍戠殑鍘熷洜錛屽鑷存垜鐩存帴涓婃ā鏉夸簡錛岀粨鏋勪綋鍙橀噺鏈夌偣澶氾紝鍐欑殑涓嶆槸寰堝ソ錛屼唬鐮佸緢闀褲傛寮忔瘮璧涗腑絎竴涓嚎孌墊爲銆?br />鍚庢潵鍚鏈塐錛坣錛夌殑綆楁硶錛岀獊鐒跺氨鎯寵搗鏉ヤ簡瀛︽牎oj涓婃湁涓閬撳閥濡欒繍鐢ㄦ暟緇勭殑棰橈紝鐒跺悗鎰熻鐢ㄦ暟緇勫彲浠ユ悶錛岃瘯浜嗕竴涓婣C鎺変簡錛屾椂闂?900+錛屾瘮綰挎鏍戠殑5000+灝戝浜嗐傘?br />銆?br />鏁扮粍浠g爜錛?br />
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXM=15003;
int a[MAXM];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int l,r,b;
memset(a,0,sizeof(a));
while(scanf("%d %d %d",&l,&r,&b))
{
if(l==-1) break;
a[l]+=b;
a[r+1]-=b;
}
int lmax=a[0],posl=0;
for(int i=1;i<=n;i++)
{
a[i]+=a[i-1];
if(lmax<a[i])
{
lmax=a[i];
posl=i;
}
}
int posr;
for(int i=n;i>=0;i--)
{
if(a[i]==lmax)
{
posr=i;
break;
}
}
printf("%d %d\n",posl,posr);
}
return 0;
}
綰挎鏍戜唬鐮侊細
DP銆?/span>
錛戙?span style="font-family: 瀹嬩綋;">姣忎竴琛屾渶澶氬彧鍙互璧頒竴嬈℃嵎寰勶紝姣忎竴鍒椾篃鏄渶澶氬彧鍙互璧頒竴嬈℃嵎寰?/span>
錛掋?span style="font-family: 瀹嬩綋;">姣忔璧拌繃鎹峰緞鍚庣殑妯潗鏍囧拰綰靛潗鏍囬兘瑕佸ぇ浜庝箣鍓嶇殑鍧愭爣
鍙姹傚嚭浠庤搗鐐瑰埌緇堢偣鎵緇忚繃鐨勬渶澶氱殑鎹峰緞錛屽氨鑳藉緱鍒版渶灝戠殑璺▼銆傛瘡涓姝ョ殑鏈浼樿В鐢ㄤ箣鍓嶈蛋榪囩殑璺緞鎵姹傦紝婊¤凍鏃犲悗鏁堟э紝姣忎竴涓瓙鐘舵侀兘鍙互姹傚嚭鏈浼樿В錛屾弧瓚蟲渶浼樺瓙緇撴瀯錛屽彲浠ョ敤dp瑙e喅銆?/span>
f[i]=max(f[j]+1,f[i]);
褰?/span>j鐐瑰潗鏍囧皬浜庣偣錛?/span>i鐐逛負鎹峰緞鏃訛紝璧板埌i鐐瑰潗鏍囨椂緇忚繃鐨勬渶澶氭嵎寰勬暟=max(璧板埌j鐐圭殑鏈澶氭嵎寰勬暟+1錛岃蛋鍒?/span>i鐐規椂鐨勬渶澶氭嵎寰勬暟)
鏈鍚庢壘鍑烘渶澶х殑f(i)灝辨槸鑳界粡榪囨渶澶氱殑鎹峰緞
娉ㄦ剰鍧愭爣鐨勮緭鍏ユ病鏈夐『搴忔э紝瑕佽繘琛屾帓鍒椼?br />
a[i][j]=a[i-1][j]+among;榪欐牱瀛樺肩殑璇濆氨鍙互杞寲鎴愭眰 鍜屾渶澶ц繛緇瓙涓?br />
0.031 | 156 KB |