# include <bits/stdc++.h> using namespace std ; const int N = 200 + 5 ; int arr [ N ] , dp [ N ] [ N ] ; int main ( ) { int t ; scanf ( "%d" , & t ) ; while ( t -- ) { int n , m ; scanf ( "%d%d" , & n , & m ) ; for ( int i = 1 ; i <= n ; i ++ ) scanf ( "%d" , arr + i ) ; for ( int i = 1 ; i <= n ; i ++ ) dp [ i ] [ i ] = 1 ; for ( int i = n ; i >= 1 ; i -- ) { for ( int j = i + 1 ; j <= n ; j ++ ) { dp [ i ] [ j ] = 1 << 25 ; for ( int k = i ; k + 1 <= j ; k ++ ) dp [ i ] [ j ] = min ( dp [ i ] [ j ] , dp [ i ] [ k ] + dp [ k + 1 ] [ j ] ) ; if ( arr [ i ] == arr [ j ] ) dp [ i ] [ j ] -- ; } } printf ( "%d\n" , dp [ 1 ] [ n ] ) ; } return 0 ; } Copy C++
發表文章
目前顯示的是 2018的文章
mac terminal vim 改成c++ IDE
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
先建立一些設定 輸入 vim ~/vimrc 然後複製以下程式碼 color torte syn on set guifont=Consolas:h16: nu sc ai si ts=4 sm sts=4 sw=4 set cursorline hi CursorLine cterm=none ctermbg=DarkGray ctermfg=White set hlsearch hi Search cterm=reverse ctermbg=none ctermfg=none set incsearch set mouse=a map <F9> <ESC>:w<CR>:!g++ % -o %< -O2 -Wall -Wno-unused-result -Wshadow -std=c++0x<CR> map <S-F9> <ESC>:w<CR>:!g++ % -o %< -O2 -Wall -Wno-unused-result -Wshadow -D_DEBUG_ -std=c++0x<CR> map <S-F10> <ESC>:w<CR>:!g++ % -o %< -O2 -Wall -Wno-unused-result -Wshadow -D_DEBUG_ -std=c++0x -fsanitize=undefined -fsanitize=address<CR> map <F5> <ESC>:!./%<<CR> map <F6> <ESC>:w<CR>ggVG"+y map <S-F5> <ESC>:!./%< < %<.in<CR> map <C-A> <ESC>:%w !pbcopy<CR><CR> nmap <C-C> :.w !pbcopy<CR><CR> vmap <C-C> :w !pbcopy<CR><CR> nma...
[TIOJ]1993. 冰塊塔
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
題目連結: http://tioj.infor.org/contests/55/problems/1993 TLE版本 #include<bits/stdc++.h> using namespace std; const int maxn=1e5+5; bool d[maxn]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); int t,n,h,a,b,c; cin>>t; while(t--) { cin>>n>>h; if(n==0) cout<<0<<endl; memset(d,0,sizeof(d)); d[0]=1; int i,j,k; for(k=1;k<=n;k++) { cin>>a>>b>>c; for(j=h;j>=0;j--) d[j]=(j>=a&&d[j-a])|(j>=b&&d[j-b])|(j>=c&&d[j-c]); } for(i=h;i>0&&d[i]!=1;i--); if(i==0) cout<<"no solution\n"; else cout<<i<<endl; } } AC版本( bitset 優化) #include<bits/stdc++.h> using namespace std; const int maxn=1e5+5; bitset<maxn>d; int main() { ios_base::sync_with_stdio(false); cin.tie(0); int t,n,h,a,b,c; cin>>...
bitset優化dp
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
以下是在codeforce找到的簡短敘述( http://codeforces.com/blog/entry/45576 ) Problem is: we have n numbers, calculate how many distinct numbers we can form by sum some of these numbers. For example if we have set {17, 23, 40} , we can form {0, 17, 23, 40, 57, 63, 80} . Dp solution is obvious: dp[0] = 1; for(int i = 0; i < n; i++) for(int j = maxv - 1; j >= a[i]; j--) // maxv is some number bigger than sum of a[i]'s dp[j] |= dp[ j - a[i] ]; cout << count(dp, dp + maxv, 1) << '\n'; Now how to optimize it? bitset can store bits and do operations 32 times faster like this: bitset dp; dp.set(0); for(int i = 0; i < n; i++) dp |= dp << a[i]; cout << dp.count() << '\n'; 假設有三個數字 17,23,40 要求將三個數字相加後的所有可能解 <法一 > 暴力直接加加看 <法二> 宣告一個bitset(由一串01組成的數組) bitset<1000>b; 第零位表示數字零是否可被加出來,第一位表示一可不可以被加出來,以此類推。 假設現在3,5,6可以被加出來,那麼要全部加9要怎麼加呢? 由剛剛定義的,可以列出以下狀態(從第零位開始列) 0 0 0 1 0 1 1 0 0 0 0 那全部加9會變這樣 0 0 0 0 0 0 0 0...
[TIOJ]1994. 冰塊線
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
由4*4的解答,可以發現解出左上U的排序,及可復制其他三格 #include<bits/stdc++.h> using namespace std; const int MAXN=2049; int a[MAXN][MAXN]; void div(int n,bool type) { if(n==0) return; int add=n>>1; int addadd=add*add; div(add,!type); if(type==0) { for(int i=0;i<add;++i) for(int j=0;j<add;++j) { a[j][i+add]=a[i][j]+addadd; a[j+add][i+add]=a[i][j]+(addadd<<1); a[n-i-1][add-j-1]=a[i][j]+addadd*3; } } else if(type==1) { for(int i=0;i<add;++i) for(int j=0;j<add;++j) { a[j+add][i]=a[i][j]+addadd; a[j+add][i+add]=a[i][j]+(addadd<<1); a[add-i-1][n-j-1]=a[i][j]+addadd*3; } } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); a[0][0]=0; int n; cin>>n; n=(1<<(n)); div(n,bool(0)); for(int i=0;i<n;i++) fo...