P1118 [USACO06FEB]Backward Digit Sums G/S

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1118 [USACO06FEB]Backward Digit Sums G/S相关的知识,希望对你有一定的参考价值。

鏍囩锛?a href='http://www.mamicode.com/so/1/%e5%bc%80%e5%a7%8b' title='寮€濮?>寮€濮?/a>   澶у皬   reset   鏆村姏   鏋氫妇   set   div   ext   next   

P1118 [USACO06FEB]Backward Digit Sums G/S

鎶€鏈浘鐗? src=

 

 鎶€鏈浘鐗? src=

 

 

棰樿В锛?br>??锛?锛夋毚鍔涙硶銆傚1锝濶杩橬涓暟鍋氫粠灏忓埌澶х殑鍏ㄦ帓鍒楋紝瀵规瘡涓叏鎺掑垪杩涜涓夎褰㈢殑璁$畻锛屽垽鏂槸鍚︾瓑浜嶯銆?br>??瀵规瘡涓帓鍒楄繘琛屼笁瑙掑舰璁$畻锛岄渶瑕?span class="katex--inline">O(N2)娆°€備緥濡傜1琛屾湁5涓暟{a,b,c,d,e}锛岄偅涔堢2琛岃绠?娆★紝绗?琛岃绠?娆♀€︾瓑绛夛紝鎬绘鏁版槸O(N2)鐨勩€?br>??a????b????c????d????e
????a+b????b+c???c+d???d+e
??????a+2b+c?b+2c+d?c+2d+e
???????a+3b+3c+d?b+3c+3d+e
??????????a+4b+6c+4d+e
??鍏辨湁N!=4浜夸釜鎺掑垪锛屾€诲鏉傚害鏄?span class="katex--inline">O ( N ! N 2 ) 鐨勶紝鏄剧劧浼氳秴鏃躲€?br>??2锛変笁瑙掕绠椾紭鍖?鍓灊銆?br>??1锛変笁瑙掕绠楃殑浼樺寲銆傚鎺掑垪杩涜涓夎褰㈣绠楋紝骞朵笉闇€瑕佹寜閮ㄥ氨鐝湴绠楋紝姣斿{a,b,c,d,e}杩?涓暟锛岀洿鎺ョ畻鏈€鍚庝竴琛岀殑鍏紡a+4b+6c+4d+e灏卞ソ浜嗭紝澶嶆潅搴︽槸O(N)鐨勩€?/span>

涓嶅悓鐨凬鏈変笉鍚岀殑绯绘暟锛屾瘮濡?涓暟鐨勭郴鏁版槸{1,4,6,4,1}锛屾彁鍓嶇畻鍑烘墍鏈塏鐨勭郴鏁板鐢ㄣ€傚彲浠ュ彂鐜帮紝杩欎簺绯绘暟姝eソ鏄潹杈変笁瑙掋€?br>??2锛夊壀鏋濄€傚嵆浣挎湁浜嗘潹杈変笁瑙掔殑浼樺寲锛屾€诲鏉傚害杩樻槸鏈?span class="katex--inline">O(N!N)锛屾墍浠ュ繀椤昏繘琛屾渶浼樻€у壀鏋濄€傚鏌愪釜鎺掑垪姹備笁瑙掑舰鍜屾椂锛屽鏋滃墠闈㈠嚑涓厓绱犲拰宸茬粡澶т簬sum锛?/span>

閭d箞鍚庨潰鐨勫厓绱犲氨涓嶇敤鍐嶇畻浜嗐€備緥濡傦紝N=9鏃讹紝璁$畻鍒版帓鍒梴2,1,3,4,5,6,7,8,9}锛屽鏋滃墠5涓厓绱爗2,1,3,4,5}姹傚拰宸茬粡澶т簬sum锛岄偅涔堝悗闈㈢殑{6,7,8,9}锝瀧9,8,7,6}閮藉彲浠ヨ烦杩囷紝

涓嬩竴涓帓搴忎粠{2,1,3,4,6,5,7,8,9}寮€濮嬨€傛湰棰榮um鈮?2345锛屽拰涓嶅ぇ锛岀敤杩欎釜绠€鍗曠殑鍓灊鏂规硶鍙互閫氳繃銆?br>??3锛夊彲浠ョ敤DFS姹傚叏鎺掑垪锛屼篃鍙互鐩存帴鐢⊿TL 鐨刵ext_permutation()姹傚叏鎺掑垪銆?/span>

 

#include <cstdio>
using namespace std;

int n,sum;
//浠ヤ笅鎵€鏈夋暟缁勭殑澶у皬閮芥瘮鎵€闇€鍊肩◢澶э紝鏄负浜嗛槻姝㈣秺鐣?/span>
int visited[25]={0}; //闃叉閲嶅閫夋暟锛岃繖鏄?dfs 鏋氫妇鎺掑垪鐨勮鐐?/span>
int ans[25]; //鏀剧疆绛旀
int pc[25];//鏋勯€犳墍鏈塱 C n-1

int dfs(int i,int num,int v); //鍐欏嚱鏁板師鍨嬫槸锛堟垜鐨勶級濂戒範鎯紒

int main(void){
    scanf("%d%d",&n,&sum);
    //涓嬮潰鏋勯€犳潹杈変笁瑙?鍗崇粍鍚堟暟琛?
    pc[0]=pc[n-1]=1; //鏉ㄨ緣涓夎鎬ц川,涓よ竟閮芥槸1
    if (n>1)
        for (int i=1;i*2<n;i++)
            pc[i]=pc[n-1-i]=(n-i)*pc[i-1]/i; //鍒╃敤鏉ㄨ緣涓夎瀵圭О鎬у拰缁勫悎鏁板叕寮忚绠?    //涓嬮潰鏋氫妇璁$畻
    if (dfs(0,0,0)) //0 浠呰捣鍗犱綅绗︿綔鐢?/span>
        for (int i=1;i<=n;i++)
            printf("%d ",ans[i]); //杈撳嚭绛旀
    return 0;
}

int dfs(int i,int num,int v){
//鍙傛暟璇存槑锛歩 琛ㄧず宸茬粡鏋氫妇浜嗗墠 i 涓暟(鏁扮殑搴忓彿浠?1 寮€濮?,num 琛ㄧず绗?i 涓暟鏄?num锛寁 琛ㄧず鍓?i 涓暟鐨勨€滃拰鈥濅负 v
//杩斿洖鍊艰鏄?杩斿洖 0 琛ㄧず涓嶈(涓嶅彲鑳?锛岃繑鍥?1 琛ㄧず鎵惧埌浜嗗彲琛岃В銆傚埄鐢ㄨ繑鍥炲€煎氨鍙互鍦ㄦ壘鍒扮涓€涓В鍚庣洿鎺ヨ繑鍥炰簡
    if (v>sum) //鈥滃壀鏋濃€濓紝鍙婃椂鎺掗櫎涓嶅彲鑳芥儏鍐碉紝鍔犻€熸灇涓?/span>
        return 0; //涓嶅彲鑳?/span>
    if (i==n){ //宸茬粡鏋氫妇浜嗗墠 n 涓紙鍏ㄩ儴锛?鍒ゆ柇涓€涓嬫槸鍚︽槸鍙瑙?/span>
        if (v==sum){
            ans[i]=num; //鏀剧疆瑙?/span>
            return 1;
        }
        else
            return 0;
    }
    visited[num]=1; //鏍囪涓€涓嬧€滅 i 涓暟鐨勫€煎凡缁忎娇鐢ㄨ繃浜嗏€?    //涓嬮潰瀵绘壘绗?i+1 涓暟
    for (int j=1;j<=n;j++){
        if (!visited[j] && dfs(i+1,j,v+pc[i]*j)){ //v+pc[i]*j琛ㄧず鍓?i+1)涓暟鐨勨€滃拰鈥?            //娉ㄦ剰锛屽鏋滄暟鐨勫簭鍙蜂粠 1 寮€濮嬶紝閭d箞绗?i 涓暟鐨勭郴鏁板疄闄呬笂鏄?(i-1) C (n-1)
            //鎵ц鍒拌繖閲岃〃绀哄凡缁忔壘鍒颁簡鍙鐨勮В
            ans[i]=num;
            return 1;
        }
    }
    visited[num]=0; //濡傛灉娌℃湁鎵惧埌锛屼竴瀹氳寰楀浣嶏紝涓鸿繘涓€姝ョ殑瀵绘壘鍋氬噯澶?/span>
    return 0; //鎵ц鍒拌繖閲屼竴瀹氭槸娌℃湁鎵惧埌瑙?/span>
}

 

以上是关于P1118 [USACO06FEB]Backward Digit Sums G/S的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1118 [USACO06FEB]数字三角形 搜索

P1118 [USACO06FEB]数字三角形`Backward Digit Su`…

洛谷 P1118[USACO06FEB]数字三角形Backward Digit Sums

P1118 [USACO06FEB]Backward Digit Sums G/S

P1118 [USACO06FEB]数字三角形`Backward Digit Su`…

做题记录: P1118 [USACO06FEB]数字三角形Backward Digit Su…