當(dāng)前位置:
首頁 >
Hdu 4293 DP
發(fā)布時(shí)間:2023/11/30
37
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Hdu 4293 DP
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
n個(gè)人說自己前面有多少人 后面有多少人
求出說真話人數(shù)最多的情況?
每個(gè)樣例有 一個(gè) n 表示n個(gè)人
接下來 n 行有a b 表示他前面的人數(shù)和后面的人數(shù)
?
思路:
如果已經(jīng)知道了其中一組的人數(shù)~
就往前找..找在這一組之前與這一組的話不矛盾的最多人數(shù)
?
Tips:
用dp[ i ][ j ] 表示從第 i+1 個(gè)人到第 j 個(gè)人為一組的時(shí)候前j個(gè)人中說真話最多的人
用tt[ i ][ j ] 表示從第 i 個(gè)人到第 j 個(gè)人之間站了多少人
用an[ i ]表示到第 i 個(gè)人前面說真話的人最多人數(shù)
?
tt[ a ][ b ]的人數(shù)不應(yīng)該多于?n-(b-a+1)?
Code:
View Code 1 #include <stdio.h> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 int dp[510][510]; 7 int tt[510][510], an[510]; 8 9 int main() 10 { 11 int i, j, k; 12 int n, a, b; 13 while(scanf("%d", &n) != EOF) 14 { 15 memset(dp, 0, sizeof(dp)); 16 memset(an, 0, sizeof(an)); 17 memset(tt, 0, sizeof(tt)); 18 19 for(i = 0; i < n; ++i) { 20 scanf("%d %d", &a, &b); 21 if(a+b < n && tt[a][n-b] < (n-a-b)) 22 tt[a][n-b]++; 23 } 24 25 for(i = 1; i <= n; ++i) 26 for(j = 0; j < i; ++j) { 27 dp[j][i] = an[j]+tt[j][i]; 28 an[i] = max(an[i], dp[j][i]); 29 } 30 31 printf("%d\n", an[n]); 32 } 33 return 0; 34 }?
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4293
轉(zhuǎn)載于:https://www.cnblogs.com/Griselda/archive/2012/09/18/2692393.html
總結(jié)
以上是生活随笔為你收集整理的Hdu 4293 DP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 4293 Groups DP
- 下一篇: vb 坐标点击