锘??xml version="1.0" encoding="utf-8" standalone="yes"?> for i = 2 to n f[i][i] =1;/*榪欓夎嚜宸?/ j = i – 1; for k = 0 to (j+1)*j/2 /*f[i][k] <----f[i-1][k] f[i][i+k] <-----f[i-1][k]*/ if(f[j][k] > 0) f[i][k] += f[j][k]; f[i][k+i] += f[j][k]; 鏈鍚庤繕鏈変竴鐐瑰氨鏄?span lang=EN-US>N = 39鏃剁粨鏋滃緢澶ц鐢?span lang=EN-US>long long鎴栬?span lang=EN-US>__int64瀛?span lang=EN-US>
鎴戠殑鎯蟲硶:棣栧厛鎶婁竴浜涜兘琛ㄨ揪鐨勬暟緇欑畻鍑烘潵,瀛樿搗鏉?鐒跺悗鍐嶇湅鏄笉鏄兘鑳借〃紺烘垨鑰呮病鏈夋渶澶у?綆楀嚭鑳借〃杈劇殑鏁版垜閲囩敤鐨勬槸dp.榪欓噷鐨刣p,姣斿璇存湁緇欎綘涓変釜鏁? 6 10瑕佷綘姹傜敤榪欎笁涓暟鑳借〃杈劇殑涓緋誨垪鏁?棣栧厛鎴戠敤涓涓暟緇刢an[]璁板綍鎵鏈夎兘琛ㄨ揪鐨勬暟,can[i]=j琛ㄧず榪欎簺鑳借〃杈劇殑鏁版寜鍗囧簭鎺掑垪鍦癷涓槸j.鍐嶇敤鏁扮粍璁板綍涓? 6 10榪欎笁涓暟鍜宑an鏁扮粍閲岄潰鐨勬煇涓暟鐩稿姞鏃舵墍鍒扮殑涓嬭〃(璇寸殑寰堟嫍鍙? -)
姣斿璇存垜鐢╥dx[0]璁板綍3榪欎釜鏁板拰can鏁扮粍鐨勭idx[0]涓暟鐩稿姞,idx[1]琛ㄧず6鍜宑an鏁扮粍鐨勭idx[1]涓暟鐩稿姞.絳夌瓑銆備笅闈㈢敤鍏蜂綋鍐欎笅榪囩▼.
棣栧厛緗甤an[0] = 0 idx[0] = idx[1] = idx[2] = 0;(涔熷氨鏄3 6 10鎺ヤ笅鏉ヤ細鍜宑an鏁扮粍鐨勭0涓浉鍔?
涓嬫爣 0 1 2 3 4 5
can 0 3(3+can[0]) 6(3+can[1]/6+can[0]) 9(3+can[2]/6+can[1]) 10(10+can[0]) 12(3+can[3]/6+can[2])
3 idx[0] 0 1 2 3 3 4
6 idx[1] 0 0 1 2 2 3
10 idx[2] 0 0 0 0 1 1
涓棿鎴戣繕鍔犱簡浜涗笢瑗?涔熷氨鏄濡傛灉鍙湁涓涓厓绱犵殑璇?閭d箞涓瀹氭槸杈撳嚭0鐨?瑕佷笉鏄兘鑳借〃紺篬榪欎釜鏁版槸1]瑕佷笉鏄棤鏈澶у?
濡傛灉鏈変竴涓厓绱犳槸1鐨勮瘽,閭d箞涓瀹氳緭鍑?(鎵鏈夌殑閮借兘琛ㄧず)
濡傛灉鍙湁涓や釜鏁扮殑璇?閭d箞鎴戜滑鍙互鐩存帴寰楀埌絳旀,濡傛灉涓や釜鏁頒簰绱犵殑璇?緇撴灉鏄痑*b-a-b,濡傛灉涓嶄簰绱犵殑璇濊緭鍑?(鏃犳渶澶у?
濡傛灉鏄瓑宸暟鍒楃殑璇?杈撳嚭0(鏃犳渶澶у?
鍏朵粬鐨勫氨鐩存帴綆楀嚭鑳借〃紺虹殑鏁?鍐嶅垽鏂緭鍑轟粈涔?br>瀹樻柟鐨勮В棰樻姤鍛婅 鍙鎵鏈夌殑鏁扮殑gcd涓嶆槸1灝辨病鏈夋渶澶у?/span>,鍏跺疄榪欎竴鐐瑰彲浠ョ敱涓婇潰2涓暟鐨勫叕寮忔帹鍑烘潵,涔熷氨鏄厛姹傚墠n-1涓暟鐨刧cd鐒跺悗鍐嶆眰gcd鍜岀n涓暟鐨刧cd,閭d箞榪欐牱鐨勮瘽,榪欓榪樻湁涓涓暟璁烘柟娉?涔熷氨鏄洿鎺ョ畻鍓峮-1涓暟鐨刧cd,鐒跺悗鐪嬭繖涓猤cd鍜岀n涓暟鐨刧cd鏄惁涓?,涓嶄負1灝辮緭鍑?,涓?灝辯敤a*b-a-b榪欎釜鍏紡綆?br>浠g爜濡備笅
ID:qcx97811
LANG:C++
PROG:nuggets
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int n;
int num[16];
int idx[16],total_idx;
int can[2000000];
int cmp(const void *a,const void *b)
{//蹇熸帓搴忎粠灝忓埌澶фā鏉?/span>
int *c = (int *)a;
int *d = (int *)b;
if(*c > *d)
return 1;
if(*c == *d)
return 0;
return -1;
}
int gcd(int a,int b)
{//鍏害鏁?/span>
int tmp;
if(a < b)
{
tmp = a;
a = b;
b =tmp;
}
while(b)
{
tmp = a;
a = b;
b = tmp%b;
}
return a;
}
int main(void)
{
freopen("nuggets.in","r",stdin);
freopen("nuggets.out","w",stdout);
int i,j;
int k,tmp;
scanf("%d",&n);
for(i = 0;i < n;i++)
{//scanf
scanf("%d",&num[i]);
}
qsort(num,n,sizeof(num[0]),cmp);//sort the number
if((1 == num[0]) || (1 == n))
{//only one num or an one in the num
printf("0\n");
return 0;
}
else
{
memset(idx,0,sizeof(idx));
memset(can,0,sizeof(can));
if(2 == n)
{//2涓暟鐨勮瘽鍙互鐩存帴綆楀嚭鏉?/span>
if(1 == gcd(num[0],num[1]))
{//濡傛灉浜掔礌鐨勮瘽
printf("%d\n",num[0]*num[1]-num[0]-num[1]);
return 0;
}
else
{//涓嶄簰绱?鑲畾鏃?/span>
printf("0\n");
return 0;
}
}
tmp = num[1] - num[0];
for(i = 2;i < n;i++)
{//鐪嬫槸鍚︿負絳夊樊鏁板垪
if(num[i]-num[i-1] != tmp)
break;
}
if(i == n)
{//濡傛灉鏄瓑宸暟鍒楃殑璇?涔熶笉鍙兘鏈?/span>
printf("0\n");
return 0;
}
can[0] = 0;
total_idx = 0;
for(i = num[0];i < 2000000;i++ )
{//涓嬫爣鏄負浜嗕笉瓚呰繃鍐呭瓨16M 鍚屾椂鏈澶?/span>
j = 0;
for(k = 1;k < n;k++)
{//澧炲ぇ鑳借〃紺虹殑鏁?/span>
if(num[k]+can[idx[k]]<num[j]+can[idx[j]])
j = k;
}
tmp = num[j]+can[idx[j]];
can[++total_idx] = tmp;
if(total_idx > num[0]-1 && (can[total_idx]-can[total_idx-num[0]+1] == num[0]-1))
{//濡傛灉宸茬粡鎵懼埌鏈澶ф暟,鍥犱負鍚庨潰鐨勬暟閮借繛緇簡
tmp = total_idx-num[0]+1;
while(can[tmp] - can[tmp-1] == 1)
{//瀵繪壘鏈澶х殑鏁?/span>
tmp--;
}
printf("%d\n",can[tmp]-1);//杈撳嚭鏈澶ф暟
return 0;
}
for(k = 0;k < n;k++)
{//鏀瑰彉鐩稿簲鐨勪笅鏍?/span>
if(num[k]+can[idx[k]] == tmp)
idx[k]++;
}
}
// for(i = 0;i <= total_idx;i++)
// printf("%d\n",can[i]);
printf("0\n");
}
return 0;
}
]]>
鎬濊礬:DP.
涓寮濮嬫垜鐢ㄤ簩緇存爲鐘舵暟緇勫幓鎼炪傛鍦ㄦ渶浼樹竴緇勬暟鎹笂(鍏?)銆傚洜涓洪偅鏍鋒湁寰堝嫻垂鐨勬搷浣溿傚彲鏄兂涓嶅嚭浠涔堝ソ鍔炴硶錛屾棤濂堥棶浜嗗ソ澶氫漢銆俤iy緹ょ殑紲炵墰浠竴鑷磋dp,baihacker澶х鐨勫仛娉曞ソ鍍忓氨榪欐牱鐨?姘村鉤澶急,鍚笉鎳傘傚悗鏉ヨ繕鏄湪涓涓湅鍙嬬殑鎸囩偣涓嬮鎮熶簡dp鐨勬濇兂銆傚叿浣撳涓?br>璁綿p[i][j] 涓轟互(i,j)涓哄乏涓婅鐨勭鍚堟儏鍐電殑杈圭殑鏈澶ч暱搴︺傞偅涔堟垜浠彲浠ュ緱鍒伴暱搴︿負k鐨勬柟闃電殑涓暟絳変簬閭d簺dp[i][j]>=k鐨勪釜鏁般?br>鐢ㄦ牱渚嬫潵璇寸殑璇?br> dp[i][j]濡備笅
1 0 4 2 3 1
0 0 3 3 2 1
1 1 2 2 2 1
0 0 2 1 1 1
0 0 1 1 0 1
1 1 1 0 0 1
閭d箞2鐨勪釜鏁板氨鏄痙p[i][j] >= 2鐨勬暟鐩篃灝辨槸6(2鐨勪釜鏁?+3(3鐨勪釜鏁?+1(4鐨勪釜鏁?=10
3鍜?鍚岀悊
閭d箞鐜板湪瑕佹眰鐨勫氨鏄墍鏈塪p[i][j]浜嗐傛垜浠彲浠ュ緱鍒板涓嬭漿縐繪柟紼嬨?br> if(0 == num[i][j])/*num瀛樼殑鏄師鐭╅樀*/
dp[i][j] = 0;/*鐭╅樀鍚?涓嶇鍚堟儏鍐?/
else
dp[i][j] = min(dp[i+1][j],dp[i][j+1],dp[i+1][j+1])+1;
鍒拌繖閲屽熀緇撴潫浜嗐傚畼鏂圭殑鏈変袱縐嶅仛娉曪紝涔熼兘鏄痙p銆傜涓縐嶆槸n^3鐨?榪欓噷灝變笉璇翠簡銆傜浜岀鏄痭^2鐨勩傝屼笖絀洪棿涔熸瘮杈冨皬錛岃繖閲岃創涓嬨?br>
瀹樻柟
1Greg Price writes:
2
3The posted solution runs in cubic time, with quadratic storage. With a little more cleverness in the dynamic programming, the task can be accomplished with only quadratic time and linear storage, and the same amount of code and coding effort. Instead of running back along the rows and columns from each square, we use the biggest-square values immediately to the west and north, so that each non-ravaged square's biggest-square value is one more than the minimum of the values to the west, north, and northwest. This saves time, bringing us from cubic to quadratic time.
4
5Another improvement, which saves space and perhaps cleans up the code marginally, is to keep track of the number of squares of a given size as we go along. This obviates the need to keep a quadratic-size matrix of biggest-square values, because we only need the most recent row for continuing the computation. As for "ravaged" values, we only use each one once, all in order; we can just read those as we need them.
6
7#include <fstream.h>
8
9ifstream fin("range.in");
10ofstream fout("range.out");
11
12const unsigned short maxn = 250 + 5;
13
14unsigned short n;
15char fieldpr;
16unsigned short sq[maxn]; // biggest-square values
17unsigned short sqpr;
18unsigned short numsq[maxn]; // number of squares of each size
19
20unsigned short
21min3(unsigned short a, unsigned short b, unsigned short c)
22{
23 if ((a <= b) && (a <= c))
24 return a;
25 else
26 return (b <= c) ? b : c;
27}
28
29void
30main()
31{
32 unsigned short r, c;
33 unsigned short i;
34 unsigned short tmp;
35
36 fin >> n;
37
38 for (c = 1; c <= n; c++)
39 sq[c] = 0;
40
41 for (i = 2; i <= n; i++)
42 numsq[i] = 0;
43
44 for (r = 1; r <= n; r++)
45
{
46 sqpr = 0;
47 sq[0] = 0;
48 for (c = 1; c <= n; c++)
49
{
50 fin >> fieldpr;
51 if (!(fieldpr - '0'))
52
{
53 sqpr = sq[c];
54 sq[c] = 0;
55 continue;
56 }
57
58 // Only three values needed.
59 tmp = 1 + min3(sq[c-1], sqpr, sq[c]);
60 sqpr = sq[c];
61 sq[c] = tmp;
62
63 // Only count maximal squares, for now.
64 if (sq[c] >= 2)
65 numsq[ sq[c] ]++;
66 }
67 }
68
69 // Count all squares, not just maximal.
70 for (i = n-1; i >= 2; i--)
71 numsq[i] += numsq[i+1];
72
73 for (i = 2; i <= n && numsq[i]; i++)
74 fout << i << ' ' << numsq[i] << endl;
75}
76
77
78
]]>
]]>
]]>
鍋氭硶:DP
鎬濊礬:璁?span lang=EN-US>f[i][j]琛ㄧず鍓?span lang=EN-US>i涓暟鑳藉緱鍒?span lang=EN-US>j鐨勯泦鍚堟暟(褰撶劧榪欓噷姣忎竴涓粨鏋滈兘澶氱畻浜嗕竴嬈?span lang=EN-US>,鍥犱負涓や釜鎯崇瓑鐨勭粨鏋滅殑涓や釜闆嗗悎閮界畻浜?span lang=EN-US>,姣斿璇村墠3涓暟,鏈墈1,2}鍜寋3}浣嗘槸濡傛灉杈撳叆3鐨勮瘽,緇撴灉鍙兘杈撳嚭1.涓嶈繃榪欐病浜?span lang=EN-US>,鍥犱負姣忎釜閮藉綆椾簡涓嬈?span lang=EN-US>,鏈鍚庣殑緇撴灉鍙闄?span lang=EN-US>2灝辮浜?span lang=EN-US>),f[i][j](0<=j<=(i+1)*i/2)鍙互鐢?span lang=EN-US>f[i-1][k]寰楀埌
杞Щ鏂圭▼:
]]>
綆鍗曚絾涓嶆槸寰堝鏄撹繃鐨勪竴閬揇P棰樸?br>鐘舵佸拰杞Щ鏂圭▼姣旇緝瀹規槗鎯熾備絾鏄敞鎰忕殑鍦版柟寰堝錛屼竴涓嶅皬蹇冨氨WA浜嗐?br>鎬濊礬:棣栧厛瀵規湪鏉挎寜楂樺害浠庝綆鍒伴珮鎺掑簭錛岃緗袱涓暟緇刲eft[],right[].鍒嗗埆琛ㄧず浠庣i鍧楁湪鏉跨殑宸?鍙?绔偣鍒板湴闈㈢殑鏈鐭椂闂淬傚鏋滀笉鑳藉埌杈懼氨鐢?1琛ㄧず銆傜劧鍚庝粠灝忓埌澶ц繘琛岄掓帹錛屽浜庝腑闂寸殑涓ゅ潡鏈ㄦ澘i,j銆傚亣璁懼鏋滅i鍧楁湪鏉跨殑宸︾鐐硅惤鍦ㄧj鍧楁湪鏉夸腑闂達紝鑰屼笖涓ゅ潡鏈ㄦ澘涓棿娌℃湁琚殧寮錛岄偅涔堢i鍧楁湪鏉跨殑宸︾鐐圭殑鏈灝忓煎彲浠ョ敱絎琷鍧楁湪鏉垮緱鍒幫紝鍙崇鐐圭殑鍒嗘瀽鍜屽乏绔偣鐩鎬技銆傚綋鐒剁敤-1琛ㄧず涓嶈兘鍒拌揪鏃舵湁涓鐐硅娉ㄦ剰鐨勫氨鏄敼鍙榣eft鍜宺ight鐨勫兼椂錛屼竴瀹氳娉ㄦ剰絎琷鍧楁湪鏉跨殑宸︾鐐?鎴栬呭彸绔偣)鑳藉惁鍒拌揪鍦伴潰涔熷氨鏄鏄惁鏄?1.榪欎竴鐐瑰鏄撹蹇借銆?br>闄勮緇嗘敞閲婄殑浠g爜
]]>
璐翠竴涓嬩粠涓嬪線涓婄畻鐨勶細
CODE
1/**//*
2 ID:qcx97811
3 LANG:C
4 PROG:numtri
5 */
6#include <stdio.h>
7#include <stdlib.h>
8#include <string.h>
9int num[1002][1002];
10int dp[1002][1002];
11int max_int(int a,int b)
12{
13 return a > b ? a:b;
14}
15int main(main)
16{
17 freopen("numtri.in","r",stdin);
18 freopen("numtri.out","w",stdout);
19 int r;
20 int i,j;
21 scanf("%d",&r);
22 for(i = 0;i < r;i++)
23
{
24 for(j = 0;j <= i;j++)
25 scanf("%d",&num[i][j]);
26 }
27 memset(dp,0,sizeof(dp));
28 for(i = 0;i < r;i++)
29 dp[r-1][i] = num[r-1][i];//鍒濆鍖栨渶鍚庝竴琛岀殑鏈浼樿В
30 for(i = r-2;i >= 0;i--)
31
{
32 for(j = 0;j <= i;j++)
33
{
34 dp[i][j] = num[i][j] + max_int(dp[i+1][j],dp[i+1][j+1]);//姣忎竴琛岀殑鏈浼樿В鐢卞畠鐨勫乏涓嬪拰鍙充笅涓や釜寰楀埌
35 }
36 }
37 printf("%d\n",dp[0][0]);//鏈緇堢粨鏋滃瓨鍦ㄧ涓涓厓绱犱腑錛屼篃灝辨槸鏈涓婇潰鐨勯偅涓?/span>
38 return 0;
39}
40
涓嬮潰鐨勪唬鐮佹槸瀹樻柟緇欑殑(鐪佸唴瀛?
CODE2
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <assert.h>
5
6#define MAXR 1000
7
8int
9max(int a, int b)
10{
11 return a > b ? a : b;
12}
13
14void
15main(void)
16{
17 int best[MAXR], oldbest[MAXR];//best鏄綋鍓嶈鐨勬渶浼樺?oldbest
18//鏁扮粍鏄綋鍓嶈鐨勪笂涓琛岀殑鏈浼樺?/span>
19 int i, j, r, n, m;
20 FILE *fin, *fout;
21
22 fin = fopen("numtri.in", "r");
23 assert(fin != NULL);
24 fout = fopen("numtri.out", "w");
25 assert(fout != NULL);
26
27 fscanf(fin, "%d", &r);
28
29 for(i=0; i<MAXR; i++)
30 best[i] = 0;
31
32 for(i=1; i<=r; i++)
{
33 memmove(oldbest, best, sizeof oldbest);//鎶婁笂涓嬈$殑鏈浼樼粨鏋滆祴鍊煎埌榪欐鐨勪笂涓琛屾渶浼樼粨鏋滀腑
34 for(j=0; j<i; j++)
{
35 fscanf(fin, "%d", &n);
36 if(j == 0)//濡傛灉鏄瘡琛岀殑寮澶?/span>
37 best[j] = oldbest[j] + n;
38 else
39 best[j] = max(oldbest[j], oldbest[j-1]) + n;
40 }
41 }
42
43 m = 0;
44 for(i=0; i<r; i++)//鍦ㄦ渶鍚庝竴琛屾煡鎵炬渶浼樺?/span>
45 if(best[i] > m)
46 m = best[i];
47
48 fprintf(fout, "%d\n", m);
49 exit(0);
50}
51
]]>