HDU 4283 - You Are the One(区间DP)
2015-08-07 22:49
435 查看
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=4283
用两种形式写了一下。。
AC。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 105;
int v[maxn], sum[maxn];
int dp[maxn][maxn];
int dfs(int l, int r)
{
if(l > r) return 0;
if(dp[l][r] != inf) return dp[l][r];
for(int i = l; i <= r; ++i) {
int cnt = dfs(l+1, i) + dfs(i+1, r) + v[l]*(i-l) + (i-l+1)*(sum[r]-sum[i]);
dp[l][r] = min(dp[l][r], cnt);
}
return dp[l][r];
}
int main()
{
int T, ca = 1;
scanf("%d", &T);
while(T--) {
int n;
scanf("%d", &n);
sum[0] = 0;
for(int i = 1; i <= n; ++i) {
scanf("%d", &v[i]);
sum[i] = sum[i-1] + v[i];
}
memset(dp, inf, sizeof(dp));
dfs(1, n);
printf("Case #%d: %d\n", ca++, dp[1]
);
}
return 0;
}
http://acm.hdu.edu.cn/showproblem.php?pid=4283
用两种形式写了一下。。
AC。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 105;
int v[maxn], sum[maxn];
int dp[maxn][maxn];
int dfs(int l, int r)
{
if(l > r) return 0;
if(dp[l][r] != inf) return dp[l][r];
for(int i = l; i <= r; ++i) {
int cnt = dfs(l+1, i) + dfs(i+1, r) + v[l]*(i-l) + (i-l+1)*(sum[r]-sum[i]);
dp[l][r] = min(dp[l][r], cnt);
}
return dp[l][r];
}
int main()
{
int T, ca = 1;
scanf("%d", &T);
while(T--) {
int n;
scanf("%d", &n);
sum[0] = 0;
for(int i = 1; i <= n; ++i) {
scanf("%d", &v[i]);
sum[i] = sum[i-1] + v[i];
}
memset(dp, inf, sizeof(dp));
dfs(1, n);
printf("Case #%d: %d\n", ca++, dp[1]
);
}
return 0;
}
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 105; int val[maxn], sum[maxn]; int dp[maxn][maxn]; int main() { //freopen("in", "r", stdin); int T, ca = 1; scanf("%d", &T); while(T--) { int n; scanf("%d", &n); sum[0] = 0; for(int i = 1; i <= n; ++i) { scanf("%d", &val[i]); sum[i] = sum[i-1] + val[i]; } memset(dp, 0, sizeof(dp)); for(int i = 1; i <= n; ++i) { for(int j = i+1; j <= n; ++j) { dp[i][j] = inf; } } for(int j = 1; j <= n; ++j) { for(int i = j; i >= 1; --i) { for(int k = 1; k <= j-i+1; ++k) { dp[i][j] = min(dp[i][j], dp[i+1][i+k-1]+val[i]*(k-1)+dp[i+k][j]+k*(sum[j]-sum[i+k-1])); } } } printf("Case #%d: %d\n", ca++, dp[1] ); } return 0; }
相关文章推荐
- HDU 1568
- HDU1290
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- HDU 1000
- HDU 1001
- HDU 1622 Trees On The Level
- HDU 1063 Exponentiation
- Hdu5033
- HDU 1166 敌兵布阵
- HDU Rightmost Digit
- hdu 1002
- 贪心 hdu 1003
- hdu 1004